본문 바로가기
Algorithm/프로그래머스

[프로그래머스] 파이썬 문제풀이 - 방문 길이

by whdgus928 2023. 6. 4.

https://school.programmers.co.kr/learn/courses/30/lessons/49994

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

첫 풀이

1. 이 문제에서 중요한건 가는길의 방향이 중요하지 않다는것이다. LRL 상황에서 출발점과 목적지가 다르지만 결국 왔던 길이기에 1이 된다.

2. 방향별로 범위를 넘지 않는다면 x,y좌표를 움직여준다

3. 시작점과 도착점을 튜플 형식으로 만들고 리스트에 없으면 넣어준다

4. 시작점과 도착점을 반대로 해서도 넣어줘야한다

def solution(dirs):
	answer=0
    x,y=0,0
    d=[]
    for i in dirs:
        tmp_x=x
        tmp_y=y
        if i=='U' and y+1<=5:
            y+=1
        elif i=='D' and y-1>=-5:
            y-=1
        elif i=='L' and x-1>=-5:
            x-=1
        elif i=='R' and x+1<=5:
            x+=1
        if ((tmp_x,tmp_y),(x,y)) not in d and (tmp_x,tmp_y)!=(x,y):
            d.append(((tmp_x,tmp_y),(x,y)))
            d.append(((x,y),(tmp_x,tmp_y)))
            answer+=1
    return answer

 

더 나은 답안

1. 좌표 상관없이 일단 더해주고 나중에 범위를 넘어갔는지 체크하면 코드가 더 깔끔해진다

2. 리스트에 있는지 체크하는것보다 집합 자료구조를 이용해 자동으로 중복 제거가 되게하면 속도가 향상된다

def solution(dirs):
    x,y=0,0
    s=set()
    for i in dirs:
        nx,ny=x,y
        if i=='U':
            ny+=1
        elif i=='D':
            ny-=1
        elif i=='L':
            nx-=1
        elif i=='R':
            nx+=1
        if -5 <= nx <= 5 and -5 <= ny <= 5:
            s.add((nx,ny,x,y))
            s.add((x,y,nx,ny))
            x,y=nx,ny

    return len(s)/2
반응형

댓글