방문 길이
문제 설명
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
- U: 위쪽으로 한 칸 가기
- D: 아래쪽으로 한 칸 가기
- R: 오른쪽으로 한 칸 가기
- L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.
예시
dirs | answer |
"ULURRDLLU" | 7 |
"LULLLLLLU" | 7 |
코드 해석 및 전체 코드
1. 좌표 변수 선언 (int x, int y)
2. dirs 길이만큼 for문 반복
3. dirs문자열 i번째와 일치하는 이동방향에 해당하는 좌표 +-
4. 현재 위치 + 이동한 위치 문자열 선언
5. 이동한 위치 + 현재 위치 문자열 선언
6. 이미 ArrayList에 값이 존재하거나 4, 5번이 같을 경우 저장하지 않음
7. for문 반복이 끝나면 visit의 사이즈 / 2한 값 반환
좌표 이동
처음 위치 (0, 0)
U일 경우 y좌표를 1 증가 시킴, y의 최댓값은 5이므로 5미만일 때만 증가 가능
D일 경우 y좌표를 1 감소 시킴, y의 최솟값은 -5이므로 -5초과일 때만 감소 가능
R일 경우 x좌표를 1 증가 시킴, x의 최댓값은 5이므로 5미만일 때만 증가 가능
L일 경우 x좌표를 1 감소 시킴, x의 최솟값은 -5이므로 -5초과일 때만 감소 가능
if (i == 'U' && p[1] < 5) p[1]++;
else if (i == 'D' && p[1] > -5) p[1]--;
else if (i == 'R' && p[0] < 5) p[0]++;
else if (i == 'L' && p[0] > -5) p[0]--;
|
p[0] : x좌표, p[1] : y좌표
방문 중복 체크
중복된 이동일 경우 반환값을 증가하지 않음. 배열에 현재 좌표 + 이동 좌표, 이동 좌표 + 현재 좌표의 값을 저장함
현재 좌표 + 이동 좌표만 저장하면 이동 좌표 → 현재 좌표로 이동한 것은 새로운 이동이라 볼 수 있기에
현재 → 이동과 이동 → 현재 경우를 모두 저장함.
한 가지 더 체크해야하는데, 범위를 벗어나게 되면 좌표의 현재 좌표는 (5, 5), 이동 좌표도 (5, 5)가 됨. 이 경우는 이동한 것이 아니므로 반환값에 더해지면 안됨. 그래서 현재 좌표와 이동 좌표가 같은지도 체크해야 함
if (!visit.includes(st) && st != nd) {
visit.push(st);
visit.push(nd);
}
|
function solution(dirs) {
var answer = 0;
let p = [0, 0]; // p[0] : x, p[1] : y
const visit = []; // 방문 좌표 저장할 배열 선언
for (let i of dirs) {
const cur_p = p.slice(); // 배열 깊은 복사
// 범위 체크 후 i에 따라 x, y +-
if (i == 'U' && p[1] < 5) p[1]++;
else if (i == 'D' && p[1] > -5) p[1]--;
else if (i == 'R' && p[0] < 5) p[0]++;
else if (i == 'L' && p[0] > -5) p[0]--;
const st = p.join('') + cur_p.join(''); // 현재좌표+이동할좌표로 join 함수 사용하여 배열 문자열로 합치기
const nd = cur_p.join('') + p.join(''); // 이동할좌표+현재좌표로 join 함수 사용하여 배열 문자열로 합치기
// visit 배열에 st나 nd 포함할 경우 방문한 좌표이므로 패스 또는 st와 nd가 같으면 이동한 게 아니라 패스
if (!visit.includes(st) && st != nd) {
visit.push(st);
visit.push(nd);
} // 코드해석 하면서 생각한 건 두 값 모두 저장해야하나...? 이다...
}
answer = visit.length / 2;
return answer;
}
'코딩 테스트 > [JS] programmers 코딩 테스트 연습' 카테고리의 다른 글
[Programmers/JS] 구명보트 / 프로그래머스 코딩 테스트 연습 (0) | 2022.01.01 |
---|---|
[Programmers/JS] 스킬 트리 / 프로그래머스 코딩 테스트 연습 (0) | 2021.12.30 |
[Programmers/JS] 이진 변환 반복하기 / 프로그래머스 코딩 테스트 연습 (0) | 2021.12.30 |
[Programmers/JS] 다음 큰 숫자 / 프로그래머스 코딩 테스트 연습 (0) | 2021.12.27 |
[Programmers/JS] 숫자의 표현 / 프로그래머스 코딩 테스트 연습 (0) | 2021.12.26 |
댓글