티스토리 뷰

 

 

 

 

 

프로그래머스

 

사이트로 이동하기 : https://school.programmers.co.kr/learn/challenges?order=acceptance_desc&page=1

 

 

 

 

 

정수를 나선형으로 배치하기

 

LV0 이지만 이 한문제 풀기 위해서 계속 안풀려서 많은 고민을 하게 되었다.

 

 

문제 설명

 

문제 설명

 

 

 

제한사항

제한 사항

 

 

예시

입출력 예시

 

 

 

 

문제 Solution 코드

 

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int value = 1;
        int row = 0, col = 0;
        int lastRow = n - 1, lastCol = n - 1;

        while (value <= n * n) {
            for (int i = col; i <= lastCol; i++)                  // right
                answer[row][i] = value++;

            for (int i = row + 1; i <= lastRow; i++)         // down
                answer[i][lastCol] = value++;

            for (int i = lastCol - 1; i >= col; i--)              // left
                answer[lastRow][i] = value++;

            for (int i = lastRow - 1; i > row; i--)              // up
                answer[i][col] = value++;

            row++;
            col++;
            lastRow--;
            lastCol--;
        }
        
        return answer;
    }
}

 

이 문제를 풀 때는 value값을 꾸준히 증가 시키기 위해 while로 전체 크기의 반복문을 걸어주었다.

다음 right로 이동하는 반복문, down 이동하는 반복문, left로 이동하는 반복문, up 이동하는 반복문을 걸어 주었다.

이 반복문을 끝나게 되면 행, 열을 한 칸 이동해서 그 작업을 반복하게 되는 것입니다.

 

뭔가 하노이 탑의 원판을 생각하면 됩니다. 큰 겉에서 부터 안쪽으로 반복문 작업을 한다고 생각하면 뭔가 이해하기 빠를 것입니다.

 

 

 

 

 

프로그래머스 문제 이해를 돕기 위한 그림 설명

 

Solution1

제일 먼저 겉 쪽으로 돌면서 반복문을 돌린다.

Solution2

안쪽으로 반복문을 돌리면서 채워 나간다.

 

 

 

 

결론

 

어떻게든 구현만 하면 된건가...? 오랫동안 고민하고 어쩌다 보니 구현은 한 것 같은데

채점을 하였을 때 걸리는 시간이나, 메모리들이 많이 안 잡아 먹어서 괜찮은 코드인건가 생각하게 된다..

다른 사람이 푼 것을 보니 코딩 테스트에는 엄청 난 사람들이 많구나 라고 생각하게 된다.

 

비둘기

 

 

 

 

감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함