테스트 #3

HR.lee·2022년 1월 27일
0

항해 WIL

목록 보기
5/24
post-custom-banner

이번 테스트는 문제를 푸는데 성공했다!
역시 프로그래머스 레벨 2 문제였다!
신난다!

드디어!

팀원님의 파이널 헬프로 멋지게 해결했다!

방문길이

게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.

U: 위쪽으로 한 칸 가기

D: 아래쪽으로 한 칸 가기

R: 오른쪽으로 한 칸 가기

L: 왼쪽으로 한 칸 가기

캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다)

단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.

문제포인트 1 : '캐릭터의 이동'이라는 개념을 정의해준다
문제포인트 2 : 맵의 크기도 정해준다 (젤다 맵처럼 갈수만 없으면 ok)
문제포인트 3 : 이미 방문한 곳을 예외처리 해준다

전체 코드

def solution(dirs):
    path = []
    visited = []
    cnt = 0
    dtn = {'U': [0, 1], 'D': [0, -1], 'R': [1, 0], 'L': [-1, 0]}
    x, y = 0, 0
    
    for i in dirs:
        new_x, new_y = x + dtn[i][0], y + dtn[i][1]
        
        if -5<= new_x <=5 and -5<= new_y <=5:
            path.append([x, y, new_x, new_y])
            x, y = new_x, new_y
            
#        print(path) 
        for v in path:
            if v not in visited:
                visited.append(v)
                
    cnt = len(visited)
    
#    print(visited)
    return cnt

캐릭터가 걸어간 모든 경로를 저장할 path
이미 방문한 좌표를 예외처리 해줄 visited
정답 처리를 위한 cnt

캐릭터의 이동범위를 좌표로 정해주는 btn <- 테스트케이스에서 문자열로 된 인자 dirs를 받아 변환해준다.

dtn = {'U': [0, 1], 'D': [0, -1], 'R': [1, 0], 'L': [-1, 0]}

캐릭터의 시작위치 x, y

문제가 시작되면 dirs 포문을 돌린다!
btn의 [dirs]값에 들어있는 리스트의 0번째, 1번째 인덱스를
각각 x와 y 좌표에 더해준 new_x와 new_y를 생성한다.

그리고 만약 new_x와 new_y의 값이 -5와 5의 사이에 있다면 캐릭터가 지나간 길 path에
[x, y, new_x, new_y] 현재 가지고 있는 모든 변수를 잘라서 저장해준다.

if -5<= new_x <=5 and -5<= new_y <=5:

저장에 성공했다면
x와 y좌표를 캐릭터가 이동한 좌표 = 현재 서있는 좌표로 갱신시켜주고 반복문을 계속 돌린다.

dirs에 입력된 커맨드를 다 돌면 이제 예외처리를 해준다!
왜냐면 문제에서 이미 갔던 곳은 제외해달라고 했기 때문에...
중복된 모든 좌표(걸어온 발자취)를 제거하면 캐릭터가 방문했던 곳의 좌표만 남고 그걸 길이만 잘라서 카운트에 넣는다!

근데 여기에서 막혔었다, 내가 작성했던 코드는 [x, y, new_x, new_y] 앞으로 가는건 계산했지만
갔다가 다시 돌아오는 좌표 [x, y, new_x, new_y] 가 다른 좌표로 취급되어 걸러지지 않았던 것이다.

테스트케이스 7까지는 통과했지만 그 이상에서는 다 실패가 떴다.

이미 시험시간도 끝났기에 답을 찾아 헤매었지만...
튜플이나 셋으로 문제를 해결한 답만 많아서 처음부터 빌드를 다시 짜야 했다.
아니면 이미 지정된 변수를 다시 path에서 접근해서 일일이 예외처리를 해주어야 했다.

이렇게 열심히 짠 코드가 없어지다니ㅠㅠ

그치만 이 문제점을 공유하다 보니 한 팀원님이 이건 어떠냐고 해결책을 제시해주셨다!

  path.append([x, y, new_x, new_y])
  path.append([new_x, new_y, x, y])

if문 안에 이 코드도 그냥 같이 추가해버리고
대신 결과값에 // 연산을 해버리면 어떠냐는 파격적인 해결책이었다.

최종 전체 코드!

def solution(dirs):
    path = []
    visited = []
    cnt = 0
    dtn = {'U': [0, 1], 'D': [0, -1], 'R': [1, 0], 'L': [-1, 0]}
    x, y = 0, 0
    
    for i in dirs:
        new_x, new_y = x + dtn[i][0], y + dtn[i][1]
        
        if -5<= new_x <=5 and -5<= new_y <=5:
            path.append([x, y, new_x, new_y])
            path.append([new_x, new_y, x, y])
            x, y = new_x, new_y
            
        for v in path:
            if v not in visited:
                visited.append(v)
                
    cnt = len(visited) // 2

    return cnt

최종 코드다!
멋져, 굉장해! 심지어 스스로 해결한 문제다!
할수 있어!

profile
It's an adventure time!
post-custom-banner

0개의 댓글