728x90
📝 문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
⚠️ 제한사항
- n은 1 이상 1,000 이하입니다.
🖨 입출력 예
n | result |
---|---|
4 | [1,2,9,3,10,8,4,5,6,7] |
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] |
📂 분류
구현
💡 풀이
문제를 보고 어떻게 접근해야 할지 고민하다가, 손으로 직접 해보고 나서야 문제를 해결했다.
n == 7, (row, col)
⬇︎ : (0, 0) -> (1, 0) -> (2, 0) -> (3, 0) -> (4, 0) -> (5, 0) -> (6, 0)
➡︎ : (6, 1) -> (6, 2) -> (6, 3) -> (6, 4) -> (6, 5) -> (6, 6) ->
⬉ : (5, 5) -> (4, 4) -> (3, 3) -> (2, 2) -> (1, 1) ->
⬇︎ : (2, 1) -> (3, 1) -> (4, 1) -> (5, 1) ->
➡︎ : (5, 2) -> (5, 3) -> (5, 4) ->
⬉ : (4, 3) -> (3, 2) ->
⬇︎ : (4, 2)
위 예시를 보면 세로에서 가로로 전환할 때는 (row, col + 1)
, 가로에서 좌상향으로 전환할 땐 (row - 1, col - 1)
, 좌상향에서 세로로 전환할 때는 (row + 1, col)
으로 좌표가 바뀐다는 것과 n은 1씩 줄어든다.
이 과정을 구현하여 2차원 배열에 저장하고, 저장한 값을 return 하면 된다.
💻 코드
class Solution {
static int[][] snail;
static int max_value = 0;
static int number = 0, row = 0, col = 0;
public int[] solution(int n) {
initialize(n);
while (true) {
if (rowIncrease(n--) == max_value) {
break;
}
if (colIncrease(n--) == max_value) {
break;
}
if (rowAndColIncrease(n--) == max_value) {
break;
}
}
return getAnswerAndReturn();
}
private int[] getAnswerAndReturn() {
int[] ret = new int[max_value];
int i = 0;
for (int[] s : snail) {
for (int n : s) {
ret[i++] = n;
}
}
return ret;
}
void initialize(int n) {
max_value = (n * (n + 1) / 2);
snail = new int[n][];
for (int i = 0; i < n; i++) {
snail[i] = new int[i + 1];
}
}
int rowIncrease(int n) {
for (int i = 0; i < n; i++) {
snail[row++][col] = ++number;
}
row -= 1;
col += 1;
return number;
}
int colIncrease(int n) {
for (int i = 0; i < n; i++) {
snail[row][col++] = ++number;
}
row -= 1;
col -= 2;
return number;
}
int rowAndColIncrease(int n) {
for (int i = 0; i < n; i++) {
snail[row--][col--] = ++number;
}
row += 2;
col += 1;
return number;
}
}
728x90
'Algorithm > 프로그래머스' 카테고리의 다른 글
[JAVA 풀이] 프로그래머스 - 주식 가격 (Level 2) (0) | 2022.03.22 |
---|---|
[JAVA 풀이] 프로그래머스 - 영어 끝말잇기 (Level 2) (0) | 2022.03.21 |
[java] 프로그래머스 - 2개 이하로 다른 비트 (Level 2) (0) | 2022.02.20 |
[javascript] 프로그래머스 - 숫자 문자열과 영단어 (2021 카카오 채용 연계형 인턴십) (0) | 2022.02.15 |
[cpp] 프로그래머스 - 거리두기 확인하기 (2021 카카오 채용 연계형 인턴십) (0) | 2022.02.15 |