본문 바로가기
코딩 테스트/[JS] programmers 코딩 테스트 연습

[Programmers/JS] 방문 길이 / 프로그래머스 코딩 테스트 연습

by M개발자 2022. 1. 1.
반응형

방문 길이

 


문제 설명

 

게임 캐릭터를 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;
}

github

programmers

 

반응형

댓글