본문 바로가기
Algorithm/Programmers

[Programmers] 삼각 달팽이

by J4J 2021. 4. 13.
300x250
반응형

문제

 

월간 코드 챌린지 시즌1 > 삼각 달팽이

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

 

 

아이디어

 

이번 문제의 아이디어는 달팽이 모양으로 회전을 하는 방법이라고 생각합니다.

 

제가 생각한 방법은 다음과 같습니다.

 

  • 아래 방향으로 이동하며 정수 값을 집어넣기
  • 배열을 벗어나거나 값이 존재하는 인덱스를 마주할 경우 우측 방향으로 방향 전환
  • 우측 방향으로 이동하며 정수 값을 집어넣기
  • 배열을 벗어나거나 값이 존재하는 인덱스를 마주할 경우 좌상단 방향으로 방향 전환
  • 좌상단 방향으로 이동하며 정수 값을 집어넣기
  • 배열을 벗어나거나 값이 존재하는 인덱스를 마주할 경우 아래 방향으로 방향 전환

 

해당 방법을 이용하여 더 이상 앞으로 나아갈 수 없을 때까지 반복해주면 자연스럽게 정답을 구할 수 있었습니다.

 

 

구현 코드 (JavaScript)

 

const getI = (i, dir) => {
    switch(dir) {
        case 0: // 아래로 이동
            return i+1;
            
        case 1: // 오른쪽으로 이동
            return i;
            
        case 2: // 왼쪽위로 이동
            return i-1;
    }
}

const getJ = (j, dir) => {
    switch(dir) {
        case 0: // 아래로 이동
            return j;
            
        case 1: // 오른쪽으로 이동
            return j+1;
            
        case 2: // 왼쪽위로 이동
            return j-1;
    }
}

function solution(n) {
    const array = Array.from(Array(n), () => Array(n).fill(0));
    let dir = 0;
    let i = 0;
    let j = 0;
    let index = 1;

    while(true) {
        array[i][j] = index++; // 현재 i, j값에 index값 집어넣기

        let nextI = getI(i, dir); // 다음 i구하기
        let nextJ = getJ(j, dir); // 다음 j구하기

        if(nextI >= n || nextI < 0 || nextJ >= n || nextJ < 0 || array[nextI][nextJ] !== 0) { // 배열의 범위를 벗어나거나 값이 있을 경우 방향 전환
            dir = (dir+1)%3; // 방향 전환
            nextI = getI(i, dir); // 현재 위치에서 방향전환했을 때 다음 i구하기
            nextJ = getJ(j, dir); // 현재 위치에서 방향전환했을 때 다음 j구하기
        }

        if(array[nextI][nextJ] !== 0) { // 방향전환을 했는데도 값이 있다면 종료
            break;
        }

        i = nextI;
        j = nextJ;
    }

    const res = [];
    for(let i=0; i<n; i++) {
        for(j=0; j<=i; j++) {
            res.push(array[i][j]);
        }
    }

    return res;
}

 

 

읽어주셔서 감사합니다.

728x90
반응형

댓글