본문 바로가기

코딩테스트 대비

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

최근에 스코페를 통해 그지 같은 코딩 능력을 가진 나를 써줄 기업이 있을까라는 의문이 생겼다ㅋㅋㅋㅋㅋㅋㅋ큐ㅠㅠㅠㅠㅠㅠ현타가 왔다...

하지만 하다 보면 길이 보이겠지 힘내자 가은아🤗

 

오늘은 Summer/Winter Coding(~2018)에 나온 '방문길이' 문제를 풀어봤다.

 

 

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

 

programmers.co.kr

프로그래머스의 문제가 참 좋은 게 그림만 봐도 어떤 식으로 풀어야 할지 감이 온다!

 

문제 설명

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

  • U: 위쪽으로 한 칸 가기
  • D: 아래쪽으로 한 칸 가기
  • R: 오른쪽으로 한 칸 가기
  • L: 왼쪽으로 한 칸 가기

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

예를 들어, "ULURRDLLU"로 명령했다면

  • 1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다.

  • 8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다.

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

 

 

딱 보면 느낌이 오겠지만 U, D, R, L에 따라서 위치를 옮기고 중복된 곳은 다시 체크하지 않고 지나왔던 길이를 구하면 되는 문제이다.

 

풀이 방법

해당 문제는 진짜 특이하게 풀었다. 문제에 나와있는 전체 좌표평면 중 모든 좌표와 선을 배열로 생각해서 넣었다.

예를 들면  아래와 같은 평면이 있으면 (-5,5)의 좌표를 (0,0)으로 (-5,5)와(-4,5) 사이의 선은(1,0) 그 옆에 점인 (-4,5)는 (2,0)로 정의하여 문제를 풀었다. 선에 방문하면 list에 표시하고 나중에 모든 루틴을 돌고 나서 방문한 선의 개수를 세는 것이다. 

 

왜?

왜 이렇게 풀었냐 하면... 그저 순전히 보기 편해서라는 단순한 이유와 내가 평면 좌표 문제는 무조건 배열로 풀기 때문이다ㅎㅎㅎ

코드

def solution(dirs):
    answer = 0
    first_way=[]
    for j in range(21):
        first_way.append([0]*21)#배열 정의
    x=10#처음 x위치
    y=10#처음 y위치
    
    for i in dirs:
        if i=='U': #위쪽으로 한칸가기
            if x>0:#좌표평면의 경계를 넘어가는 명령을 무시
                first_way[x-1][y]=1#선 방문한것을 체크
                x-=2#점으로 이동
        elif i=='D': #아래쪽으로 한 칸 가기
            if x<20:
                first_way[x+1][y]=1
                x+=2
        elif i=='R':#오른쪽으로 한 칸 가기
            if y<20:
                first_way[x][y+1]=1
                y+=2
        elif i=='L':#왼쪽으로 한 칸 가기
            if y>0:
                first_way[x][y-1]=1
                y-=2

    for k in range(len(first_way)): #선의 개수 세는 것.
        for j in range(len(first_way)):
            if (k%2==0 and j%2==1)or(k%2==1 and j%2==0):#선인 경우는 list에서 한 쪽은 홀수고 한쪽은 짝수이다. 
                if first_way[k][j]==1:
                    answer+=1
    return answer

 

실행결과

 

 

해당 문제를 풀면서 python 문법에 대해 지식이 생겼다.

처음 배열 선언을 위해 아래와 같은 방법으로 배열을 선언했다.

first_way=[[0]*21]*21
#해당 방법으로 선언했는데 이렇게 선언할 경우 주소를 계속 가져가기 때문에

first_way=[0][1]=1#이런식으로 값을 바꾸었을때 해당 y좌표가 1로 된것은 다 '1'이라는 값으로 바뀐다.

 

그런데 위에서 말한 문제가 생겼고 배열 선언할 때는 아래와 같은 방법을 사용해야 한다는 것을 알게 되었다ㅎㅎ

 

   first_way=[]
    for j in range(21):
        first_way.append([0]*21)#배열 정의

+) 질문하기에 보면 테스트 케이스 예시중에  "LLLLRLRLRLL" -> 6 이라는 이야기가  있다

그런데 해당 케이스를 실제로 돌려보면 Output이 5가 나와야 한다.