삼각달팽이 (Programmers Lv.2)

더보기
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

처음 문제를 봤을 때 팩토리얼을 응용하여 n부터 1까지의 숫자를 더하고,
삼각형을 그린 후 다시 해당 숫자까지 더하고를 반복하는 식으로 구상했었다.

 

int Sum(int n){
    if(n == 1)
        return 1;

    return n + Sum(n-1);
}

 

하지만 결과는 오답...

 

고민하고 또 고민한 끝에 문제를 풀이하는 방식에는 접근할 수 있었다.

 

삼각형을 그릴 때

 

' / ' ' ㅡ ' ' \ '

 

의 순서로 진행하기에, 해당 모양 순서로 계산하면 되겠구나!

 

...... 그러나 솔로 구현에는 실패하고야 말았다.

구글링을 해서 비슷하게 풀이를 진행한 코드를 발견하고 내 식대로 표현하고 공부한 결과.

 

c++ 풀이)

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

using namespace std;

vector<int> solution(int n) {
    vector<int> answer;

    vector<vector<int>> snail(n+1, vector<int>(n+1));

    int val = 1, y = 1, x = 1;
    for(int i=1; i<=n; i++){
        if(i%3 == 1){
            for(int j=i; j<=n; j++)
				snail[y++][x] = val++;
            // '/' 이후 'ㅡ' 이므로 y는 위로(1칸), x는 오른쪽(1칸)으로 이동 
			y--;
			x++;
        }
        else if(i%3 == 2){
            for(int j=i; j<=n; j++)
				snail[y][x++] = val++;
            // 'ㅡ' 이후 '\'이므로 y는 위로(1칸) - 이미 마지막 인덱스, x는 왼쪽(2칸)으로 이동 - 계산할 인덱스로
			y--;
			x -= 2;
        }
        else if(i%3 == 0){
            for(int j=i; j<=n; j++)
				snail[y--][x--] = val++;
            // '\'이후 '/'이므로 y는 아래로(2칸), x는 오른쪽(1칸)으로 이동
			y += 2;
			x++;
        }
    }

    for(int i=1; i<=n; i++){
        for(int j=1; j<=i; j++)
            answer.push_back(snail[i][j]);
    }

    return answer;
}

 

js 풀이)

function solution(n) {
    let answer = [];
    let snail = Array.from(Array(n+1), () => Array(n+1).fill(null))
    
    let val=1, y=1, x=1;
    for(let i=1; i<=n; i++){
        if(i%3 === 1){
            for(let j=i; j<=n; j++)
                snail[y++][x] = val++;
            
            // 'ㅡ' 수행해야하니까 y위, x오른쪽으로 (계산할 인덱스로)
            y--;
            x++;
        }
        else if(i%3 === 2){
            for(let j=i; j<=n; j++)
                snail[y][x++] = val++;
            
            // '\' 수행해야하니까 y위, x왼쪽2칸으로 (계산할 인덱스로)
            y--;
            x -= 2;
        }
        else if(i%3 === 0){
            for(let j=i; j<=n; j++)
                snail[y--][x--] = val++;
            
            // '/' 수행해야하니까 y아래(2칸), x오른쪽으로 (계산할 인덱스로)
            y += 2;
            x++;
        }
    }
    
    for(let i=1; i<=n; i++){
        for(let j=1; j<=i; j++)
            answer.push(snail[i][j]);
    }
    
    return answer;
}

 

값을 할당할 변수와 x , y 를 따로 선언하여 계산하는 풀이 방식이 꽤나 참신해서 해당 문제를 복습하는 시간을 가져보았다.

 

마지막으로 이 문제에서 크게 느꼈던 바가 뭐냐면...

 

알고리즘은 옛날부터 느껴왔지만 백준 골드 2, 3, 4를 왔다리 갔다리 해도 실버 문제를 틀릴 때도 많고

프로그래머스 Lv.4를 풀어봤어도 Lv.2 문제를 틀리는 경우도 빈번하게 생긴다.


물론 그만큼 내 기본기가 탄탄하지 않다는 뜻이겠지... 더 노력하고 공부하자...!