1. 문제
programmers.co.kr/learn/courses/30/lessons/68645
2. 접근 방법
1) 규칙을 찾기 어려워서 단순 구현으로 생각했음
2) 아래 -> 옆 -> 위 방식으로 값을 채우고, 값을 채우는 개수가 처음 아래 방향으로 N개, 우측 방향으로 N-1개, 위 방향으로 N-2개..처럼 채우는 개수를 하나씩 줄이는 규칙을 발견했다.
3) cnt : (아래,옆,위) 방향으로 갈 "개수", num : 배열에 넣을 "값",minCnt : 해당 방향으로 값을 넣었던 개수로 변수를 정의해서 while문으로 minCnt == cnt가 될 때까지 값을 채워나갔음
3. 실수했던 부분
1) core dump : 맨 마지막 조건에서 cnt--을 빼먹음 + {i,j}값을 ++할 때 순서를 유의하자.
2) 오래 걸렸던 이유 : 일단 구현부터 하다보니 실수가 잦았다. 직접 배열에 값을 채워 넣고 충분히 규칙을 찾거나 구현 법이 명확해 질 때 코딩 시작하기
3) cnt 변수 처럼 지속적으로 ++을 하거나 --을 하는 변수는 종료 조건을 cnt != 0 보단 cnt <0 || cnt >0 로 하기
4) 내부 while문 조건을 minCnt != cnt로만 했었는데, cnt > 0조건도 추가해야 함! 그래야 이중 while문에서 cnt = 0이되는 순간 바로 나올 수 있다.
4. 코드
더보기
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n) {
vector<int> answer;
int map[1001][1001];
int cnt = n;
int i = -1, j =0; //인덱스
int num = 1; //달팽이 채우기 값
while(cnt > 0) {
int minCnt = 0;
while( cnt != minCnt && cnt > 0) {
map[++i][j] = num++;
minCnt++;
}
cnt--;
minCnt = 0;
while( cnt != minCnt && cnt > 0) {
map[i][++j] = num++;
minCnt++;
}
cnt--;
minCnt = 0;
while(cnt != minCnt && cnt > 0) {
map[--i][--j] = num++;
minCnt++;
}
cnt--;
}
//데이터 삽입
for(int i=0;i<n;i++) {
for(int j=0;j<i+1;j++) {
answer.push_back(map[i][j]);
}
}
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Lv1] K번째 수(C++) (0) | 2020.10.17 |
---|---|
[Lv2]구명보트(C++) (0) | 2020.10.17 |
[Lev.2] 수식 최대화(C++) (0) | 2020.07.03 |
[Lev.3] 경주로 건설 (0) | 2020.07.03 |
[Lev.3] 자물쇠와 열쇠(C++) (0) | 2020.07.01 |