Coding Test/Python (백준, 프로그래머스)

[프로그래머스] 삼각 달팽이 (Lv.2) - Python(파이썬)

ʕ민지ʔ 2024. 8. 16. 20:04

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

 

프로그래머스

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

programmers.co.kr

 
문제

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

제한 사항

n은 1 이상 1,000 이하입니다.

입출력 예


풀이 과정

문제 아이디어가 생각나지 않아 40분을 끙끙대다가, 결국 다른 사람의 풀이를 확인하고 이해했다 :(
다음엔 같은 유형의 문제가 나오면 풀 수 있도록 기록한다 .. 🐥

 
n=5일 때, 삼각형의 각 변에 위와 같이 숫자가 채워진다.
[1, 2, 3, 4, 5] - [6, 7, 8, 9] - [10, 11, 12] - [13, 14] - [15]
총 5번의 채우기가 일어나고 이는 n과 동일한 값이다.
 
각각의 채우기 회차에서는 n-회차 개의 값이 들어간다. (회차는 0부터 시작)
0회차: 5-0 = 5개 [1, 2, 3, 4, 5]
1회차: 5-1 = 4개 [6, 7, 8, 9]
2회차: 5-2 = 3개 [10, 11, 12]
3회차: 5-3 = 2개 [13, 14]
4회차: 5-4 = 1개 [15]
 
이때 하 -> 우 -> 좌상 으로 한 바퀴가 이루어지므로 (세 변)회차 % 3 == 0 이면 아래 (0, 3회차)회차 % 3 == 1 이면 오른쪽 (1, 4회차)나머지 경우는 왼쪽 대각선 위로 올라간다. (5회차)
 

def solution(n):
    answer = [[0 for j in range(1, i+1)] for i in range(1, n+1)]
    
    x,y = -1, 0
    num = 1
    
    for i in range(n):
        for j in range(i, n):
            if i%3 == 0:
                x += 1
            elif i%3 == 1:
                y += 1
            else:
                x -= 1
                y -= 1
            answer[x][y] = num
            num += 1
    
    return sum(answer, [])

 
 
1) 삼각형 모양의 배열 만들기

 
2) 값을 채울 배열의 위치 (x,y)와 채울 값 num
아래로 내려가기부터 시작하므로 처음 위치를 (-1,0)으로 잡아준다. (0,0) 부터 채우기를 시작할 수 있도록!!
채우는 값 num은 1부터 시작한다.

3) 이중 반복
먼저 채우기가 일어나는 횟수만큼 반복하고 (n회)
각 채우기에서 채울 값의 개수만큼 반복한다 (n-i개)

4) 배열 위치
아래로 이동하는 경우는 x축의 위치를 +1
오른쪽으로 이동하는 경우는 y축의 위치를 +1
왼쪽 위로 이동하는 경우는 x,y축 위치를 -1

5) 배열에 값 넣기
배열 위치 조정을 완료했으므로 값 num을 넣어준다.
다음 반복을 위해 num의 값을 1 증가시킨다.

6) 1차원 배열로 반환
모든 채우기를 완료하면 삼각형 모양의 배열을 1차원 배열로 변환시켜 답을 반환해야 한다.
이때 sum(answer, []) 을 사용하면 손쉽게 1차원 배열로 변환할 수 있다 ..! 유레카🍭

 

참고

- https://developnote.tistory.com/26