본문 바로가기

코딩테스트/프로그래머스

27. 삼각 달팽이 Lv.2 : 월간 코드 챌린지 시즌1_ C++

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

* 코드

#include <string>
#include <vector>
#include <iostream>
using namespace std;

vector<int> solution(int n) {
    vector<int> answer;
    int arr[1001][1001];
//     이걸 좀 보기 편하게 생각해보면 왼쪽으로 쫙 밀었을 때 아래로 쭉 내려갔다가 오른쪽으로 쭉 갔다가 x-1, y-1하면서 올라갔다가를 반복하면서 모든 블록을 채울 때까지 반복하면 된다.
    
    int x = 0, y = 0;
    int state = 0; // state = 0: 아래로 내리기, 1: 우측으로보내기, 2: 왼쪽 위 대각선으로 가기
    int num = 1;
    
    for(int i=0; i<n; i++) {
        switch(state) {
            case 0:
                for(int k=i; k<n; k++) {
                    arr[x++][y] = num++;
                }
                x--;
                y++;
                state = 1;
                break;
            case 1:
                for(int k=i; k<n; k++) {
                    arr[x][y++] = num++;
                }
                x--;
                // y가 이미 더해져 버려 -=2한다.
                y-=2;
                state = 2;
                break;
            case 2:
                for(int k=i; k<n; k++) {
                    arr[x--][y--] = num++;
                }
                x+=2;
                y++;
                state = 0;
                break;
        }
    }
    
    
    for(int i=0; i<n; i++) {
        for(int j=0; j<=i; j++) {
            answer.push_back(arr[i][j]);
        }
    }
    return answer;
}

 

* 해설

이 문제는 3개의 연산을 반복하는 구조다. 2차원 배열에 놓고 그림을 생각해보면 

1) 맨 아래쪽으로 (x값을 증가시키며) 내려가는 동작
2) 오른쪽으로 (y값을 증가시키며) 가는 동작
3) 왼쪽 위 대각선으로 (x--, y--) 가는 동작

 

이 3가지가 있다.

 

이것을 반복해가며 배열에 num을 1씩증가시키며 차례대로 넣은 후 그 배열 그대로 vector에 넣으면 해결이다. 간단하지만 각각의 동작을 구현하고 다음 동작으로 넘어가게 하는 것에 대해 많은 생각을 하게 하는 문제였다.

 

다른 사람의 풀이도 찾아보았는데 다른 사람은 아예 %3 == 0 , 1, 2 를 이용해 스위치문을 사용하지 않고 푼 것을 확인할 수 있었다.