본문 바로가기
파이썬 알고리즘 코딩

삼각달팽이 (프로그래머스 level2)

by 볼록티 2020. 11. 4.
728x90
반응형

문제 설명

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

 


제한사항

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

입출력 예

nresult

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]

 

def solution(n):
    answer = []
    floors = [i for i in range(1,n+1)] # 체크해야할 각층을 나타내는 리스트.
    n_d = dict([i,[]] for i in range(1,n+1)) # 각층을 나타내는 딕셔너리
    numbers = [i for i in range(1,int((n+1)*n/2)+1)] # n 까지의 리스트 생성.
    direction = 1 
    idx1 = 0 #내려갈때 삽입할 인덱스.
    idx2 = 0 #올라갈때 삽입할 인덱스.
    
    while numbers:
        
        sample = numbers[:n] # 삽입할 숫자.
        numbers = numbers[n:] # 삽입할 숫자를 뺀 numbers.
        
        
        if direction == 1:   # 내려가는 경우.
            for i in floors:
                n_d[i].insert(idx1,sample.pop(0))
            
            floors = floors[1:]
            direction = 2
            idx1 += 1
            n-=1
    
        elif direction == 2: # 밑층을 모두 채우는 경우.
            a,b = n_d[floors[-1]][:idx1], n_d[floors[-1]][idx1:]
            n_d[floors[-1]] = a + sample + b
            
            direction = 3
            n-=1    
            floors = floors[:-1] # 마지막 층을 채우고 floors 에서 제거.
            
        
        elif direction == 3: # 올라가는 경우.
            for i in floors[::-1]:
                n_d[i].insert(len(n_d[i]) + idx2, sample.pop(0))
                
            floors = floors[1:]
            direction = 1
            idx2 -= 1
            n-=1      
        
    for i in n_d.values():
        answer.extend(i)
    return answer

 

배열을 가지고 구현을 하였다. 삼각형의 변을따라 왼쪽 변을 따라 내려가는 경우, 아래 변을 따라 지나가는 경우, 오른쪽 변을 따라 올라가며 채우는 부분. 

 다소 직관적이었지만은.. 푸는데 1시간 넘게 걸린 듯하다... 계속 화이팅하자 !

728x90
반응형

댓글