본문 바로가기
Tests/프로그래머스

[Programmers] 프로그래머스 파이썬 > 월간 코드 챌린지 시즌1 > 삼각 달팽이

by 코딩하는 금융인 2020. 11. 2.

문제. 프로그래머스 월간 코드 챌린지 시즌1 삼각달팽이


문제 설명

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

문제 예시


제한사항

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

입출력 예

n result
4 [1,2,9,3,10,8,4,5,6,7]
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]

출처 : 프로그래머스 삼각 달팽이

 

코딩테스트 연습 - 삼각 달팽이

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


나의 풀이 in Python

#[Programmers] 프로그래머스 파이썬 > 월간 코드 챌린지 시즌1 > 삼각 달팽이
'''# 예시
n = 1 : [1] 1
n = 2 : [1,2,3] 3
n = 3 : [1,2,6,3,4,5] 6
n = 4 : [1,2,9,3,10,8,4,5,6,7] 10
n = 5 : [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 15
개수에 대한 식 : f(n) = f(n-1)+ n , n>=2 f(1) = 1
'''
from itertools import chain
def solution(n):
    # n층의 개수는 n개 -> 리스트화
    maps = [[0]*i for i in range(1,n+1)]
    # 인덱스 값은 0부터 시작하므로 y축에 -1, x축에 0
    y, x = -1,0
    # 인덱스에 해당하는 값은 1부터
    number = 1
    for i in range(n):
        for j in range(i,n):
            if i % 3 == 0: y += 1
            elif i % 3 == 1: x += 1
            elif i % 3 == 2:
                y -= 1
                x -= 1
            maps[y][x] = number
            number +=1
    # chain을 활용하여 2차원 배열을 1차원으로 펴주기
    answer = [i for i in chain(*maps)]
    return answer

문제가 복잡하며 보이지만, 움직이는 방향을 천천히 생각하면 됩니다.

1. 리스트 안에 n개의 개수를 가진 리스트를 만들어 2차원 배열을 생성합니다.

2. 위, 아래, 오른쪽 총 3개의 방향으로 이동하므로 3개의 경우에 대한 조건문을 만들어줍니다.

3. itertools의 chain 함수를 활용하여 2차원 배열인 maps를 1차원 형태의 answer 리스트로 만들어서 문제를 마칩니다.

 

오랜만에 복잡한 문제를 푸니 시간이 오래 걸려 다른 분들의 코드를 참조하여 풀었습니다.

반응형

댓글