본문 바로가기
프로젝트들/코딩 테스트

[코딩테스트] 프로그래머스 - 삼각달팽이 (Lv.2) in Python

by 코곰 2021. 2. 15.

밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행

첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return.

 

 

programmers.co.kr/learn/courses/30/lessons/68645

 

풀이

- 수학적 공식이 있나 잠깐 생각했지만 그걸 알아내는 시간이 더 걸릴 것 같아서 (후에 검색해보니 없댄다!),

삼각형 모양 배열을 먼저 초기화해주고,

실제 달팽이 모양으로 숫자를 채워준 후,

배열을 flatten하여 리턴하는 방식으로 풀었다.

 

- 달팽이 모양으로 숫자를 채우는 알고리즘을 짜는데 쓸데없이 고민을 많이 했지만 ㅠ 결국 풀게된 방법은 쉬웠다!

~> 어차피 채울 때는 한 방향으로, 일정 횟수만큼 채움 (아래로는 n번, 오른쪽으로는 n-1번, 위쪽으로는 n-2번)

~> 따라서 한 획씩, 모든 칸이 채워질 때까지 loop 돌림

 

파이썬 구현

 

def solution(n):
	answer = []
    # 2차원 list 초기화
    for i in range(1, n+1):
        answer.append([0]*i)
        
    i = -1
    j = 0
    count = 0
    
    while n > 0:
    	# 아래쪽으로 채움
        for x in range(n):
            i += 1
            count += 1
            answer[i][j] = count
        # 오른쪽으로 채움
        for x in range(n-1):
            j += 1
            count += 1
            answer[i][j] = count
        # 위쪽으로 채움
        for x in range(n-2):
            i -= 1
            j -= 1
            count +=1
            answer[i][j] = count
        n -= 3
        
    # 1차원배열로 flatten
    final = [x for y in answer for x in y]
    
    return final

 

메모

- 배열을 1차원으로 flatten할 때,

numpy library를 사용하는 법을 기억하자.

(빠르기 때문)

 

~> 하지만 이 문제에서는 쓸 수 없는데, numpy는 온전한 행렬 (nxm)의 경우에만 쓸 수 있기 때문.

 

 

다차원 배열을 1차원으로 flatten하는 다양한 방법을 아주 잘 설명해 주신 포스트

참고 - blog.winterjung.dev/2017/04/21/list-of-lists-to-flatten

 

 

댓글