728x90
반응형

월간 코드 챌린지 시즌 1 에서 출제된 문제다.
난이도는 Level 2.

문제 풀이

처음에 보자마자 무언가 규칙이 있을 것이라고 생각하고 문제를 풀었다.
규칙을 찾으려고하니 너무 어렵게 느껴져 정말 무식하게...😆
문제를 코드로 그대로 옮겨보았다.

2차원 배열을 사용해서 값을 순서대로 입력받았다.
삼각형 모양을 가지고 있고 왼쪽 변부터 값을 입력한다.
그래서 상태 값을 통해 왼쪽일 경우 0, 아래일 경우 1, 오른쪽일 경우 2 로 정했다.
그리고 2차원 배열에 값을 넣어줘야 하니까 x 와 y 를 이용해 배열의 위치를 정해주었다.

나는 2차원 배열을 이용해서 다음 모양으로 값을 넣어주었다.

n = 5 일 경우를 예를 들어 풀어보자.

삼각형의 왼쪽 변부터 값을 채워나간다. ( 상태가 0 일 경우 )
2차원 배열에서 아래로 이동하면서 값을 넣어주어야 하니까 x의 값만 증가시켜주면서 배열에 값을 넣는다.
다 넣었으면 오른쪽으로 한 칸 이동한 후 값을 넣어주어야 하기 때문에 y 값을 하나 증가시킨다.
그리고 후위 연산자를 사용했기 때문에 x의 값이 하나 증가되었기 때문에 x의 값은 하나 감소시켜준다.
따라서, 값을 다 넣은 후 x - 1 , y -1 을 해준다.
다음에는 아래 변에 값을 채워야 하기 때문에 상태값을 1로 변경해준다.

다음으로 삼각형의 아래 변에 값을 채워나간다. (상태가 1일 경우)
2차원 배열에서 오른쪽으로 이동하면서 값을 넣어주어야 하니까 y의 값만 증가시켜주면서 배열에 값을 넣는다.
다 넣었으면 왼쪽 대각선으로 이동해서 값을 넣어주어야 하기 때문에 x 와 y의 값을 하나 감소시킨다.
그리고 후위 연산자를 사용했기 때문에 y 의 값이 하나 증가되었기 때문에 y의 값을 하나 더 감소시켜준다.
따라서, 값을 다 넣은 후 x - 1 , y -2 를 해준다.
다음에는 오른쪽 변에 값을 채워야 하기 때문에 상태값을 2로 변경해준다.

마지막 경우인 삼각형의 오른쪽 변에 값을 채워넣으면된다. (상태가 2일 경우)
2차원 배열에서 왼쪽 대각선으로 이동하면서 값을 넣어주어야 하니까 x와 y의 값 둘다 감소시켜주면서 값을 넣는다.
다 넣었으면 다시 왼쪽 변에 값을 넣어야 하기 때문에 아래로 이동하면서 x 값을 하나 증가시킨다.
그리고 후위 연산자를 사용해서 x와 y의 값이 하나 감소되어 있기 때문에 x 와 y의 값을 하나 증가시켜준다.
따라서, 값을 다 넣은 후에 x + 2 , y + 1 을 해준다.

이제 끝날 때까지 왼쪽 -> 아래 > 오른쪽 과정을 반복해주고
값을 다 넣었으면 인덱스 순서대로 배열에 넣어주면 된다.

소스 코드

#include <string>
#include <vector>
#include <iostream>

using namespace std;

vector<int> solution(int n) {
    vector<int> answer;
    
    int arr[1000][1000]; // 2차원 배열을 이용해서 값을 입력
    
    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;
                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;
}

 

728x90
반응형
복사했습니다!