2024. 3. 9. 20:46ㆍ코딩 테스트/[프로그래머스] Java
문제 설명
문제 풀이
가장 먼저 떠올랐던 아이디어는 각 행과 열을 지정해서 순서대로 입력해야 할 것 같았다.
/*
1. 0번째 행: 1~n(n-1개)까지 순서대로
2. n-1번째 열: n~n+(n-1)개까지 순서대로
3. n-1번째 행: n+(n-1) ~ (n+(n-1))+(n-1)까지 역순으로
4. 0번째 열: (n+(n-1))+(n-1) ~ ((n+(n-1))+(n-1))+(n-1-1)까지 순서대로
5. ...
*/
위 아이디어를 떠올려봤는데 너무 규칙성이 없어 보였다..
하나하나 하드코딩하는 것 같아서, 왠지 이 방법이 아닌 것 같았다.
따라서 다른 아이디어를 계속 고민해 보았다!
두번째 아이디어는 인덱스와 숫자 사이에 규칙성이 있는지 확인해보기이다.
이를 확인하기 위해서는 각 인덱스별 숫자값을 써보고, 눈으로 규칙이 있나 없나 확인해 볼 수 있었다.
If n = 4,
[0][0] = 1
[0][1] = 2
[0][2] = 3
[0][3] = 4
--------------
[1][3] = 5
[2][3] = 6
[3][3] = 7
--------------
[3][2] = 8
[3][1] = 9
[3][0] = 10
--------------
[2][0] = 11
[1][0] = 12
--------------
[1][1] = 13
[1][2] = 14
--------------
[2][2] = 15
--------------
[2][1] = 16
--------------
여기서 찾을 수 있었던 규칙이 하나 있었다.
행 고정 & 열 순차적으로 변경 > 열 고정 & 행 순차적으로 변경 > 반복 ...
여기서 더 파고 들어가서 다른 규칙을 찾아보았다.
0행 고정 & 0,1,2, ..., n-1열까지 변경 > n-1열 고정 & 1,2, ..., n-1열까지 변경 >
n-1행 고정 & n-2, n-3, ... 0열까지 변경 > 0열 고정 & n-2, n-3, ... 1까지 변경 >
1행 고정 & 1,2, ... n-2열까지 변경 > n-2열 고정 & ...
즉, 처음 행을 고정해 놓은 이후부터는 다음 행부터 진행되고, 고정된 이후 행은 값을 더이상 채우지 않아도 된다.
이를 나타내주기 위해 각 인덱스를 변수로 놓고 증가시켜주었다. 다음은 코드로 작성한 것이다.
class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int count = 1;
int row = 0;
int row_end = n - 1;
int col = 0;
int col_end = n - 1;
while (count <= n * n) {
// 좌>우
for (int i = col; i <= col_end; i++) {
answer[row][i] = count++;
}
row++;
// 상V하
for (int i = row; i <= row_end; i++) {
answer[i][col_end] = count++;
}
col_end--;
// 좌<우
for (int i = col_end; i >= col; i--) {
answer[row_end][i] = count++;
}
row_end--;
// 상^하
for (int i = row_end; i >= row; i--) {
answer[i][col] = count++;
}
col++;
}
return answer;
}
}
'코딩 테스트 > [프로그래머스] Java' 카테고리의 다른 글
[코딩테스트연습] 코딩 기초 트레이닝 > Lv.0 주사위 게임3 (0) | 2024.03.10 |
---|---|
[코딩테스트연습] 코딩테스트 입문 > Lv.0 겹치는 선분의 길이 (0) | 2024.03.09 |
[코딩테스트연습] 코딩테스트 입문 > Lv.0 자릿수 더하기 (2) | 2024.03.07 |
[코딩테스트연습] 코딩테스트 입문 > Lv.0 머쓱이보다 키 큰사람 (0) | 2024.03.07 |
[Java] Stringbuilder란? (0) | 2024.03.07 |