Life Engineering
[프로그래머스] 삼각 달팽이 (Java) 본문
https://programmers.co.kr/learn/courses/30/lessons/68645
class Solution {
static int N;
public int[] solution(int n) {
int[] answer = new int[n*(n+1)/2];
int[][] map=new int[n][n];
int y=0, x=0;
int num=1;
N=n;
while(true){
if (num>(n*(n+1)/2)) break;
while (isRange(y,x) && map[y][x]==0){
map[y][x]=num;
num++;
y++;
}
y--;
x++;
while (isRange(y,x) && map[y][x]==0){
map[y][x]=num;
num++;
x++;
}
x-=2;
y--;
while (isRange(y,x) && map[y][x]==0){
map[y][x]=num;
num++;
y--;
x--;
}
y+=2;
x++;
}
int cnt=0;
for (int i=0; i<n; i++){
for (int j=0; j<i+1; j++){
answer[cnt++]=map[i][j];
}
}
return answer;
}
public static boolean isRange(int y, int x){
return y>=0 && x>=0 && y<N && x<N;
}
}
-규칙성을 찾는 게 중요한 문제
1. 왼쪽 아래로 움직이고
2. 오른쪽으로 움직이고
3. 대각선 방향으로 이동하고
이 움직임을 구현한다.
1,2,3 도는 것을 1 사이클로 할 때, 몇번 사이클로 돌아야 하는지 몰라서 num을 기준으로, n*(n+1)/2 가 되었을 때 반복문을 종료하는 것으로 했다.
근데 이렇게 하면 코드가 복잡하다. 다른 분들의 코드를 보니,
for(let i = n; i > 0; i-=3){
for(let j = 0; j < i ; j++) {numArr[++row][col] = curNum++;}
for(let j = 0; j < i-1 ; j++) {numArr[row][++col] = curNum++;}
for(let j = 0; j < i-2 ; j++) {numArr[--row][--col] = curNum++;}
}
3만큼 감소시켜 가면서 돌릴 사이클의 수를 계산할 수 있다.
n=5라면, 5->4->3->2->1 개만큼 각 단계에서 수를 써주기 때문에.. 3을 감소시켜 사이클의 수를 알고,
각 사이클의 단계에서는 쓸 수를 그 전 단계보다 -1 해가면서 써줄 수 있다.
규칙성을 찾는게 중요한 문제!
'Problem Solving' 카테고리의 다른 글
[프로그래머스] 2개 이하로 다른 비트 (Java) (0) | 2022.03.01 |
---|---|
[프로그래머스] 후보키 (Java) (0) | 2022.03.01 |
[BOJ 13305] 주유소 (Java) (0) | 2022.02.25 |
[BOJ 17822] 원판 돌리기 (Java) (0) | 2022.02.25 |
[BOJ 17143] 낚시왕 (Java) (0) | 2022.02.24 |