잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→

현록의 기록저장소

[Lv3] 방문 길이 본문

Problem Solving/programmers

[Lv3] 방문 길이

현록 2019. 4. 22. 23:17

https://programmers.co.kr/learn/challenges

 

프로그래밍 강의 | 프로그래머스

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

문제 설명

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

  • U: 위쪽으로 한 칸 가기

  • D: 아래쪽으로 한 칸 가기

  • R: 오른쪽으로 한 칸 가기

  • L: 왼쪽으로 한 칸 가기

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

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

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

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

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

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

예를 들어, LULLLLLLU로 명령했다면

  • 1번 명령어부터 6번 명령어대로 움직인 후, 7, 8번 명령어는 무시합니다. 다시 9번 명령어대로 움직입니다.

이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.

명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.

제한사항

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

입출력 예

dirs answer
"ULURRDLLU" 7
"LULLLLLLU" 7

 

입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
문제의 예시와 같습니다.

 

 


 

안 가본 곳(point)가 아니라, 안 가본 루트(구간)으로 봐야하기 때문에,

 

점 들로 이루어진 맵이 아니라, ─와 │로 이루어진 맵을 각각 만들어야 합니다.

 

─은 11행10열, │는 10행11열로 이루어져있네요. 이 맵은 구간(막대기들)을 표현하는 맵이고,

 

별개의 포인트 위치로 생각할 현재 위치 now도 5,5 정도로 생각합니다.

(좌표는 0,0이지만 -5~5가 아니라 0~10으로 생각하면 상관없음.)

boolean[][] maplr = new boolean[11][10];
boolean[][] mapud = new boolean[10][11];
int[] now = new int[] {5,5};

 

 

char[] order = dirs.toCharArray();
int answer = 0;
for(int i=0;i<order.length;i++) {
    switch(order[i]) {
    case 'U':{
        if(now[0]>0) {
            now[0]-=1;
            if(!mapud[now[0]][now[1]]) answer++;
            mapud[now[0]][now[1]] = true;
        }
        break;
    }
    case 'D':{
        if(now[0]<10) {
            if(!mapud[now[0]][now[1]]) answer++;
            mapud[now[0]][now[1]] = true;
            now[0]+=1;
        }
        break;
    }
    case 'L':{
        if(now[1]>0) {
            now[1]-=1;
            if(!maplr[now[0]][now[1]]) answer++;
            maplr[now[0]][now[1]] = true;
        }
        break;
    }
    case 'R':{
        if(now[1]<10) {
            if(!maplr[now[0]][now[1]]) answer++;
            maplr[now[0]][now[1]] = true;
            now[1]+=1;
        }
        break;
    }
    }
}
return answer;

U와 D는 세로작대기맵인 mapud만 사용될테고, L과 R은 가로작대기맵인 maplr만 사용될겁니다.

 

U/D,L/R에서 위치(포인트) 좌표인 now와 구간좌표 mapud/maplr의 index 관계를 잘 보고 결정합니다.

+1일 수도 -1일 수도 있으니..

 

세어보면 U와 L은 먼저 -1을 하고 -1값을 토대로 true표시를 하면 방문체크가 되고,

D와 R은 먼저 true표시를 하고 +1을 하면 좌표와 구간 index가 일치합니다.

 

이 부분은 5,5에서 5,6으로 혹은 5,4로 또는 4,5 등으로 움직이면서 한번씩만 머리로 대입해보면 알 수 있음.

 

false인(처음 밟는구간만) 애들만 true하면서 answer++한 결과 반환.

'Problem Solving > programmers' 카테고리의 다른 글

[Lv3] 최고의 집합  (0) 2019.04.23
[Lv3] 줄 서는 방법  (0) 2019.04.23
[Lv3] 거스름돈  (0) 2019.04.22
[Lv3] 가장 긴 팰린드롬  (0) 2019.04.22
[Lv3] 등굣길  (0) 2019.04.22
Comments

잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→