알고리즘 코테준비
[프로그래머스]정수를 나선형으로 배치하기
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을 증가시킨다.
반응형