알고리즘/프로그래머스

200923 [월간 코드 챌린지 시즌1] 9월 문제-삼각 달팽이(C++) - 오류

쭈친 2020. 9. 22. 14:22

programmers.co.kr/learn/courses/30/lessons/68645

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

문제:

그림으로 보면 이해가 가는데 배열로 어떻게 작성해야 할지 좀 막막했습니다.

수학적인 관계로 접근해서 봤을 때 복잡할 것 같아서 해설을 봤는데 간단한 문제였습니다.

별 찍기처럼 채운 다음 배열에 값들을 넣으면 되는 것이었습니다.

창의력이 없어서 출제자의 의도를 파악하지 못 했습니다.

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n) {
    int temp[n][n];
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++)
            temp[i][j] = -1;
    }
 
    int i,j=0;
    int k = 1;
    temp[i][j] = k;
    while(k<n){
        while (i + 1 < n && k < n && temp[i + 1][j] < 0) {
			temp[++i][j] = ++k;
		}
       while(j+1 < n && k < n && temp[i][j + 1] < 0) {
			temp[i][++j] = ++k;
		}
        while (i - 1 > 0 && j - 1 > 0 && k < n &&  temp[i - 1][j - 1] < 0) {
			temp[--i][--j] = ++k;
		}
    }
    
    k = 0;
    vector<int> answer;
	for (i = 0; i < n; i++) {
		for (j = 0; j <= i; j++) {
			answer[k++] = temp[i][j];
		}
	}
    return answer;
}

  

코드:

세로로 n만큼 채우고 그다음은 가로로 n만큼 채우는 것을 반복합니다.

값이 채워진 것들에는 넣지 않기 위해서 0보다 큰지 확인합니다.(배열을 -1로 초기화 하고, 입력값은 1부터 시작하므로 값이 있다면 0보다 무조건 큽니다. )

그리고 아래에서 위, 오른쪽에서 왼쪽으로처럼 거꾸로 된 방향으로 채워지는 것도 있어서 반복문의 조건이 다릅니다.