자몽이 조아

[프로그래머스]정수를 나선형으로 배치하기 본문

알고리즘 코테준비

[프로그래머스]정수를 나선형으로 배치하기

Grapefruitgreentealoe 2025. 2. 12. 11:25
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

function solution(n) {
    //1. 배열초기화
    const answer = new Array(n).fill(0).map(()=>[...Array(n).fill(0)])
    let dir = 'r'
    //2. 채우기
    //위치 변경해가면서 채우기
    // rdlu
    let x = 0;
    let y = 0;
    
    
    for(i=1;i<(n*n)+1;i++){
        answer[y][x] = i;
        if(dir == 'r'){
            if(x+1<n && answer[y][x+1] == 0){
                x+=1;
            } else{
                dir = 'd'
                y+=1;
            }
            continue;
        }
        else if(dir == 'd'){
            if(y+1<n && answer[y+1][x] == 0){
                y+=1;
            } else{
                dir = 'l'
                x-=1
            }
            continue;
        }
        else if(dir=='l'){
            if(x>=1 && answer[y][x-1] == 0){
                x-=1;
            } else{
                dir = 'u'
                y-=1;
            }
            continue;
        }
        else if(dir=='u'){
            if(y>=1 && answer[y-1][x] == 0){
                y-=1;
            } else{
                dir = 'r'
                x+=1;
            }
            continue;
        }
        
    }
    // answer[x][y] = i + 1
    // 순서대로 돌아가면서 1씩 증가해서 채울거고
    // x,y의 방향만 내가 돌아가면서 고칠거야
    //방향 전환 조건
    // 처음에는 n-1인지 확인한다
    // 그 다음부터는 이미 차있을때. 아무것도 안하고 각 방향의 다음 방향으로 돌려주기. 

    return answer;
}

처음 시작할때 일단 채운다. 그리고 조건문에서 그 다음값에 대한 검증을 미리 하고, 좌표만 바꿔준다.

 

다른사람 답 분석

더보기
function solution(n) {
    const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    const answer = Array.from(new Array(n), () => new Array(n).fill(0))
    let x = 0, y = 0, dir = 0, num = 1;
    while(num <= n * n) {
        answer[x][y] = num;
        let nextX = x + move[dir][0];
        let nextY = y + move[dir][1];
        if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) {
            dir = (dir + 1) % 4;
            nextX = x + move[dir][0];
            nextY = y + move[dir][1];
        }
        x = nextX;
        y = nextY;
        num ++;

    }
    return answer;

교과서같은곳에 나온듯한 답이다. 

 

move: x좌표(r,l), y(u,d)을 가산할 배열이다.  r,d,l,u 순으로 정해져 있다. 

answer: 리턴할 나선형보드

x,y: 좌표

dir: 방향. 초기값은 0으로 move의 인덱스를 담당. 

num: 보드에 추가할 숫자

 

n*n 만큼 num을 증가시켜가면서 반복문을 돌린다. 

우선 보드에 num을 추가해준다.

다음 x,y값을 만들때, 현재 좌표에 다음 방향에 맞는 값을 추가해준다. 

그런데 만약에 다음 값이 n보다크거나 0보다 작거나, 값이 이미 존재 할 경우

방향을 변경해준다. dir = (dir+1)%4의 의미는  move배열의 현재 방향에서 다음방향으로 이동하겠다는 것

여기서 조금 수정하자면 , 
nextX와 nextY의 값을 재할당 하는 부분이 중복 되므로 if문 이후에 추가하는 것이 좋아 보인다.

 x와 y에 각각 nextX와 nextY를 할당해주고 num을 증가시킨다.

 

 

 

 

 

 

 

반응형

'알고리즘 코테준비' 카테고리의 다른 글

[프로그래머스]주사위게임3  (0) 2025.02.12
[프로그래머스] 게임 맵 최단거리 - BFS  (0) 2022.05.19
최단경로 찾기  (0) 2022.01.19
다이나믹 프로그래밍  (0) 2022.01.13
Comments