알고리즘/프로그래머스
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보다 무조건 큽니다. )
그리고 아래에서 위, 오른쪽에서 왼쪽으로처럼 거꾸로 된 방향으로 채워지는 것도 있어서 반복문의 조건이 다릅니다.