본문 바로가기

알고리즘/프로그래머스

[Lv2]삼각달팽이(C++)

1. 문제

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

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