https://school.programmers.co.kr/learn/courses/30/lessons/68645
규칙을 찾아서 (x, y) 좌표에 있는 블럭에 적히는 숫자가 무엇인지 공식을 산출해보려 했으나.. 실패했다.
그래서 그냥 주어진 문제대로, 반시계 방향으로 숫자를 채워나가는 방식을 사용했다.
단지 그림상으론 삼각형 구조의 블럭이지만, 프로그램상 n * n 구조의 배열을 사용 했고, 그림상의 블록들을 모두 왼쪽 정렬해서 진행했다.
class Solution {
int[] dx = {1, 0, -1};
int[] dy = {0, 1, -1};
public int[] solution(int n) {
boolean[][] checked = new boolean[n+1][n+1];
int[][] boxes = new int[n+1][n+1];
int num = 1;
boxes[1][1] = num++;
checked[1][1] = true;
int[] pos = new int[] {1, 1};
int vector = 0;
int last = n * (1 + n) / 2;
while (num <= last) {
if (vector > 2) vector -= 3;
int x = pos[0] + dx[vector];
int y = pos[1] + dy[vector];
if (x > n || x < 1 || y > n || y < 1) {
// 꼭지점에 도달
vector++;
continue;
} else if (checked[x][y]) {
// 이미 채워진 자리 도달
vector++;
continue;
}
pos = new int[] {x, y};
checked[pos[0]][pos[1]] = true;
boxes[pos[0]][pos[1]] = num++;
}
int[] answer = new int[last];
int idx = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (checked[i][j]) {
answer[idx++] = boxes[i][j];
}
}
}
return answer;
}
}
'코딩테스트 > programmers' 카테고리의 다른 글
두 큐 합 같게 만들기 (0) | 2023.11.15 |
---|---|
큰 수 만들기 (0) | 2023.11.15 |
소수 찾기 (1) | 2023.11.13 |
다리를 지나는 트럭 (0) | 2023.11.09 |
가장 큰 수 (0) | 2023.11.09 |