[프로그래머스/Java] Lv.0 정수를 나선형으로 배치하기

febCho·2024년 3월 22일
0

코딩테스트

목록 보기
124/253
post-thumbnail

문제

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

- 제한사항

  • 1 ≤ n ≤ 30

풀이

역대급으로 어려웠던 문제.. 하도 삽질을 많이 해서 오답을 따로 저장해둘 새가 없었다.

우선 필요한 변수들을 선언한다.

  1. int num = 1; : 정수형 배열 int[][] answer에 저장될 값이다.
  2. int row = 0; : 열이 순차적으로 증가할 때(왼→오) 사용되는 행이다.
  3. int col = 0; : 행이 순차적으로 증가할 때(위→아래) 사용되는 열이다.
  4. int maxRow = n - 1; : 열이 순차적으로 감소할 때(오→왼) 사용되는 행이다.
  5. 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문제는 꼭 풀고 벨로그에 기록을 남기는 걸 목표로 화이팅 해봐야지 !!!

profile
Done is better than perfect.

0개의 댓글