양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
역대급으로 어려웠던 문제.. 하도 삽질을 많이 해서 오답을 따로 저장해둘 새가 없었다.
우선 필요한 변수들을 선언한다.
int num = 1;: 정수형 배열int[][] answer에 저장될 값이다.int row = 0;: 열이 순차적으로 증가할 때(왼→오) 사용되는 행이다.int col = 0;: 행이 순차적으로 증가할 때(위→아래) 사용되는 열이다.int maxRow = n - 1;: 열이 순차적으로 감소할 때(오→왼) 사용되는 행이다.int maxCol = n - 1;: 행이 순차적으로 감소할 때(아래→위) 사용되는 열이다.
row와 col만으로 2차원 배열의 인덱스를 변경하며 값을 넣으려고 하니 제일 바깥쪽으로 돌며 값을 넣고 나서 재사용이 어려웠다. 그래서 감소할 때 사용할 변수 maxRow와 maxCol을 생성했다.
배열에 저장될 값 num을 이용해 while(num <= n * n)이라는 조건을 만들어 주었다. 이것도 처음에는 for문으로 해보려고 했는데 실패했다 ㅜ
그다음으로는 col과 maxCol, row와 maxRow가 각각 이차원 배열의 최소값, 최대값을 갖는 만큼 둘을 이용해 for문의 범위를 만들어 주면 된다. 그리고 값을 저장할 때는 num++;을 넣어주는 것이다.
값을 저장하고 나서는 재사용을 위해 방향에 맞게 증감식으로 인덱스 변수들을 변경해 주면 된다.
이런 문제를 풀 때는 재사용 해야 하는 단위로 케이스를 묶는 게 중요한 것 같다. 이 문제에서는 루프를 돌며 증가하고 감소하는 행이 곧 열의 범위가 되고, 열이 곧 행의 범위가 된다는 점을 발견하는 게 핵심이었다.
class Solution {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int num = 1;
int row = 0;
int col = 0;
int maxRow = n - 1;
int maxCol = n - 1;
while (num <= n * n) {
for (int i=col; i<=maxCol; i++) { //오른쪽으로 이동
answer[row][i] = num++;
}
row++;
for (int i=row; i<=maxRow; i++) { //아래쪽으로 이동
answer[i][maxCol] = num++;
}
maxCol--;
for (int i=maxCol; i>=col; i--) { //왼쪽으로 이동
answer[maxRow][i] = num++;
}
maxRow--;
for (int i=maxRow; i>=row; i--) { //위쪽으로 이동
answer[i][col] = num++;
}
col++;
}
return answer;
}
}


이 문제를 끝으로 코딩테스트 기초 문제 풀이가 끝났다!! 야호!!
2월 27일을 시작으로 총 25일간 하루도 안 빠지고 문제를 푼 내가 대견하다.
기초 문제를 풀며 코딩테스트하는 습관을 들였으니, 내일부터는 코딩테스트 입문 문제를 풀어볼 거다. 이것도 매일 풀어야 하는 문제 개수가 주어지던데.. 아무리 바빠도 매일 1문제는 꼭 풀고 벨로그에 기록을 남기는 걸 목표로 화이팅 해봐야지 !!!