[Problem Solving] 방문 길이

Sean·2023년 10월 28일
0

Problem Solving

목록 보기
116/130

문제

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

제한 사항

  • dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
  • dirs의 길이는 500 이하의 자연수입니다.

풀이

아이디어

  • 지나온 길을 체크하기 위해 defaultdictf를 사용
  • 현재 좌표 (cur_x, cur_y)와, 방향에 따른 다음 좌표 (next_x, next_y)를 구한다.
    • 다음 좌표가 유효한 범위의 좌표라면, 현재 좌표와 다음 좌표 튜플이 담긴 리스트를 만들고, 그 리스트를 오름차순 정렬한다.
    • 해당 리스트에 담긴 숫자들을 모두 합쳐 하나의 문자열로 만들고, 그걸 defaultdict의 key값으로 사용한다. (road_id라고 하겠다)
    • defaultdict[road_id] 값이 0이라면 값과 answer값을 1 증가시켜주고 현재 좌표 값을 다음 좌표 값으로 업데이트 한다.
      만약 값이 1 이상이라면 이미 방문했던 길이라는 뜻이므로 answer값은 그대로 냅두고 현재 좌표 값을 다음 좌표값으로 업데이트만 한다.

코드

from collections import defaultdict
def solution(dirs):
    visited = defaultdict(int)
    #상하좌우 지정
    dx = [0, 0, -1, 1]
    dy = [-1, 1, 0, 0]
    answer = 0
    cur_x, cur_y = 0, 0
    
    for d in list(dirs):
        next_x, next_y = 0, 0
        if d == 'U':
            next_x, next_y = cur_x + dx[0], cur_y + dy[0]
        elif d == 'D':
            next_x, next_y = cur_x + dx[1], cur_y + dy[1]
        elif d == 'L':
            next_x, next_y = cur_x + dx[2], cur_y + dy[2]
        elif d == 'R':
            next_x, next_y = cur_x + dx[3], cur_y + dy[3]
        
        if -5 <= next_x <= 5 and -5 <= next_y <= 5:
            temp = [(cur_x, cur_y), (next_x, next_y)]
            temp.sort()
            temp = [''.join(str(t)) for t in temp]
            road_id = ''.join(temp)
            if not visited[road_id]:
                visited[road_id] += 1
                answer += 1
            cur_x, cur_y = next_x, next_y
                
    return answer

진짜 천재 풀이

아이디어

  • set을 사용한다. 길을 지나갈 때마다 다음 좌표가 유효한 범위 내에 있다면 (현재 좌표, 다음 좌표), (다음 좌표, 현재 좌표) 튜플을 set에 추가한다.
    • 그러면 똑같은 길을 지나가도 어차피 set이니까 add해봤자 추가되지 않는다.
    • 현재 좌표를 다음 좌표값으로 업데이트한다.
  • 마지막으로 set의 길이에 2를 나눈것이 정답이다. (길을 추가할 때마다 좌표를 2번씩 추가해줬으므로)
  • 그리고 각 명령어에 따른 좌표 이동을 dictionary에 저장해 놓은 것도 코드를 정말 깔끔하게 사용할 수 있는 방법이었다!!! (나는 그렇게 안해서 똑같은 로직을 if문 4번에 걸쳐서 씀)

코드

def solution(dirs):
    s = set()
    d = {'U': (0,1), 'D': (0, -1), 'R': (1, 0), 'L': (-1, 0)}
    x, y = 0, 0
    for i in dirs:
        nx, ny = x + d[i][0], y + d[i][1]
        if -5 <= nx <= 5 and -5 <= ny <= 5:
            s.add((x,y,nx,ny))
            s.add((nx,ny,x,y))
            x, y = nx, ny
    return len(s)//2
profile
여러 프로젝트보다 하나라도 제대로, 깔끔하게.

0개의 댓글