더보기 더보기 게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다. 예를 들어, "ULURRDLLU"로 명령했다면
이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다) 단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다. 예를 들어, "LULLLLLLU"로 명령했다면
이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. 명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요. □제한사항
□입출력 예
🌼 JAVA 알고리즘
□풀이과정 오늘은 풀이과정이 많이 길다.. 코드 바로보기 이용 추천! 각 좌표에 해당하는 점의 개수만큼의 배열을 생성해서
아무래도 L(left),R(right),U(up),D(down)의 값을 서로 계산하며 배열의 인덱스를 맞추다 보니
다행히 테스트케이스에서는 잘 작동했지만, 코드를 제출하니 반 이상의 결과가 실패였다. 위의 테스트케이스(특히 테스트2)의 출력문을 잘 살펴보면, 마지막 2개의 L에서는 answer의 값이 증가하지 않는 것이 맞지만 위의 출력문을 통해 지금 테스트코드는 거의 운으로...맞춘것임을 알았고 다시 분석에 들어갔다.
이전 코드의 문제점이엇던 2개의 L(좌표의 한계를 넘어갔을 경우)과 마지막 U를 정상적으로 작동하도록 고쳤다. 하지만 테스트2에서 다른 점으로부터 이동했던 좌표를 현재좌표로부터 이동했던 좌표와 일치하게 인식해 쉽게 말하면 이를 해결하기 위해 flag를 생성해서 겹치는 점을 처음 지났을 경우 map[x][y]가 true이더라도 answer을 증가시키도록 했다.
계속해서 테스트2에 중점을 두고 코드를 조금씩 수정했다.
드디어.....! 통과가 되나 했지만 제출 후 검사하기에서 대부분의 경우에 실패했다. 결국 풀이방식을 완전히 바꾸어보기로 했다. 추가한 테스트케이스를 통과하지 못한 위의 코드지금 코드의 가장 큰 문제는 출발좌표와 이동좌표가 제대로 check되지 않는다는 점이다. 위의 테스트3의 경우를 잘 보면 L -> R -> L 의 경로로 이동했을 경우 가는 방향을 true로 체크해야하지만 따라서 점의 좌표가 아닌 "경로"를 check하는 방법을 떠올렸다. 출발좌표를 sX,sY, 이동좌표를 aX,aY라고 했을 때 경로는 "sX"+"sY"+"aX"+"aY"로 표시할 수 있다. 이때 파란 경로와 초록 경로는 일치해야 하기 때문에 왼쪽으로 이동 → 경로 : 출발좌표+이동좌표 와 같은 기준을 세웠다.
위에서 설명했던 대로 이동할 때마다 경로를 생성했다.
위 코드에 도착(이동)좌표의 범위 체크를 더하면 될것이다. 확실히 배열을 사용하지 않다 보니 인덱스가 음수가 나오는것에 대해 고민할 필요가 없어 좋았다.
분명 문제해결 방법은 맞는듯 싶은데 값이 이상해서 봤더니 □완성코드
□링크 About Me 💻GitHub/KimSky904 KimSky904 - Overview Department of New Media Software. KimSky904 has 8 repositories available. Follow their code on GitHub. github.com code-review.tistory.com 코딩테스트 연습 - 방문 길이 programmers.co.kr |