코테 노트/프로그래머스

Level 2 방문 길이 Python 3

화요밍 2022. 3. 13. 15:10
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/49994?language=python3 

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

 

최종 코드

 

GitHub - hwayeon351/Programmers-Algorithms: 프로그래머스 알고리즘 소스 코드 모음

프로그래머스 알고리즘 소스 코드 모음. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

def solution(dirs):
    answer = 0
    direction = {'U': 3, 'D': 1, 'R': 2, 'L': 0}
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    visit = [[[0]*11 for _ in range(11)] for _ in range(4)]
    x, y = 5, 5
    
    for dir in dirs:
        now_d = direction[dir]
        nx = x + dx[now_d]
        ny = y + dy[now_d]

        if nx < 0 or nx > 10 or ny < 0 or ny > 10: continue
        if visit[now_d][y][x] or visit[(now_d+2)%4][ny][nx]: 
            x = nx
            y = ny
            continue
            
        visit[now_d][y][x] = 1
        visit[(now_d+2)%4][ny][nx] = 1
        x = nx
        y = ny
        answer += 1
    
    return answer

풀이 과정

풀이 시간 43분

def solution(dirs):
    answer = 0
    direction = {'U': 3, 'D': 1, 'R': 2, 'L': 0}
    #L, U, R, D
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]
    
    #visit[dir][y][x] = (x, y) 좌표의 dir 방향에 방문했다면 1, 아니라면 0
    visit = [[[0]*11 for _ in range(11)] for _ in range(4)]
    
    #현재 위치 (x, y)를 시작 위치로 초기화
    x, y = 5, 5
    
    for dir in dirs:
    	#현재 이동할 방향
        now_d = direction[dir]
        #새롭게 이동할 칸
        nx = x + dx[now_d]
        ny = y + dy[now_d]
		
        #좌표 평면을 벗어난 경우, 무시한다
        if nx < 0 or nx > 10 or ny < 0 or ny > 10: continue
        
        #이전에 방문한 적 없는 경로라면, answer 카운팅 후 방문처리
        if not visit[now_d][y][x] and not visit[(now_d+2)%4][ny][nx]: 
            answer += 1
            visit[now_d][y][x] = 1
            visit[(now_d+2)%4][ny][nx] = 1
            
        #현재 위치를 갱신한다
        x = nx
        y = ny
    
    return answer
    
#시간복잡도 = O(n), 공간복잡도 = O(n)

 

728x90
반응형