저고데

[프로그래머스]방문 길이 본문

프로그래머스

[프로그래머스]방문 길이

진철 2023. 2. 4. 22:37
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/49994

 

프로그래머스

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

programmers.co.kr

코드를 작성하기 위한 순서는 다음과 같다.

1. 각 이동 방향을 나타내기 위한 딕셔너리를 만들어준다.

2. 시작 위치를 잡아준다.

3. 이동 가능한 범위를 벗어나는 경우 건너뛰어준다.

4. 이동하지 않은 길의 수만 구해야하기 때문에 이동한 좌표를 리스트에 넣어주고 set을 사용하여 중복된 길을 제거한다.

def solution(dirs):
    answer = 0
    move={'U':(-1, 0), 'D':(1, 0), 'R':(0, 1), 'L':(0, -1)} #1번
    x=5 #2번
    y=5
    record=[]
    for i in dirs:
        dx, dy=move[i]
        if not (x+dx<=10 and x+dx>=0 and y+dy<=10 and y+dy>=0): #3번 : 괄호를 꼭 사용하여야 한다. (괄호가 없으면 not을 먼저 인식해서 답이 다르게 나옵니다 !)
            continue
        record.append((x,y,x+dx,y+dy)) #4번 : 오른쪽으로 갔다가 다시 왼쪽으로 오는 경우도 중복된 길이기에 다음과 같이 두 가지를 담아준다.
        record.append((x+dx,y+dy,x,y)) #괄호 전체의 중복 여부를 판단하는 것이기 때문에 대괄호가 아닌 소괄호를 사용한다.
        x+=dx
        y+=dy
    recordset=set(record)
    answer=len(recordset)//2 #모든 경우가 오른쪽으로 갔다가 다시 왼쪽으로 오는 경우가 아니기 때문에 2로 나누어준다.
    return answer

사실 해당 문제는 카카오 공채 문제보다 더 오려걸렸던 것 같다. (한 2시간 걸린 듯 해요 ㅠㅠ)

처음에는 모든 좌표를 0으로 초기화하고 이동할 시 +1을 해주어서 이동 전의 좌표와 이동 후의 좌표가 모두 2이상이면 중복된 길이라고 판단하고 문제를 물었다.

하지만 8번부터 모두 틀렸었다.

다른 반례를 생각하다가 왼쪽으로 갔다가 오른쪽으로 가는 경우도 중복된 길이라는 것을 깨닫고 set를 사용하여 문제를 해결할 수 있었다.

왔다갔다하는 중복된 길을 찾기 위해서 이동 전 좌표, 이동 후 좌표 그리고 이동 후 좌표, 이동 전 좌표 두 가지 경우 모두 리스트에 넣어주는 것이 핵심이었던 것 같다.

그리고 그냥 중복된 길의 갯수를 찾기 위해서 나누기 2를 하는 것이 중요했다.

 

또한, set는 리스트 내 중복된 원소를 제거하는 함수이기 때문에, set([1, 2, 3, 4], [1, 2, 3, 4])와 같이 여러 리스트를 넣어주면 에러가 난다는 것도 알 수가 있었다. 

앞으로 set를 사용할 때는, 소괄호인지 대괄호인지 유심히 확인해야할 듯하다.

728x90
반응형