HackerRank-Python

Prepare > Python > Collections > Piling Up!

stem_sw 2023. 9. 22. 21:49
 

Piling Up! | HackerRank

Create a vertical pile of cubes.

www.hackerrank.com

 

문제


STDIN        Function
-----        --------
2            T = 2
6            blocks[] size n = 6
4 3 2 1 3 4  blocks = [4, 3, 2, 1, 3, 4]
3            blocks[] size n = 3
1 3 2        blocks = [1, 3, 2]



"""
Yes
No
"""

 

 

=> n개로 이뤄진 블럭 묶음을 보고 피라미드(아래있는 블럭이 위 블럭보다 짧으면 안됨)구조로 쌓을 수 있는지 판별해야함

  • 블럭 묶음에서 뺄 수 있는 블럭은 양 끝에 존재하는 블럭임
  • T개의 블럭 묶음이 주어질것
  • 각 블럭 묶음은 n개의 블럭으로 이뤄짐
  • 블럭 묶음은 블럭들의 길이들로 표현됨

 

 

 

 

코드


from collections import deque 

T = int(input())


for _ in range(T):
    n = int(input())
    cube_length = deque([int(x) for x in input().split()])
    
    old = 2 ** 31
    latest = 0
    for i in range(n):
        if cube_length[0] >= cube_length[-1]:
            latest = cube_length.popleft()
            if old < latest:
                break 
            old = latest
        else:
            latest = cube_length.pop()
            if old < latest:
                break 
            old = latest
            
    if old < latest:
        print('No')
    else:
        print('Yes')

혼자 풀어냈다...스스로를 자랑스러워하자ㅋㅋㅋㅋ

 

 

 

노트


풀이 아이디어

T개의 케이스를 검증해야함: for 반복문으로 구현

 

피라미드 구조로 쌓기위한 조건은

  • 새로 뽑은 블럭길이 <= 이전에 뽑은 블럭 길이: if 문과 pop()으로 구현
  • 왼쪽에서도 뽑을 수 있어야하기에 자료형을 deque로 전환해 popleft() 메소드 허용

새 블럭 길이 > 이전 블럭 길이 이면

  • No 출력하고 반복문 멈추면 됨: if문과 break문으로 구현

 

 

세팅!

from collections import deque 

T = int(input())


for _ in range(T):
    n = int(input())
    cube_length = deque([int(x) for x in input().split()])
  • T개의 블럭 묶음을 검증해야하므로, 반복문 설정
  • 블럭 묶음의 블럭 개수와, 블럭 길이로 이뤄진 블럭 묶음을 가져옴

 

 

기존블럭과 새 블럭 길이 판별

    old = 2 ** 31 
    latest = 0 
    for i in range(n):  # 각 블럭 묶음의 길이만큼 검증해야함
        if cube_length[0] >= cube_length[-1]:  # 왼쪽 블럭 길이가 더 긴 경우
            latest = cube_length.popleft()  # 블럭 묶음에서 왼쪽블럭 뽑기(새 블록)
            if old < latest:  # 이전 블록과 새 블록 비교
                break         # 반복문 break
            old = latest  # 비교하고 이상 없을 경우 새 블록이 기존 블럭이 됨
            
        else:                                  # 오른쪽 블럭 길이가 더 긴 경우
            latest = cube_length.pop()
            if old < latest:
                break 
            old = latest
  • 두 번째 반복문 밖에서도 latest로 비교할 일이 추후에 있기에 변수 설정
  •  최초 기존 블럭(old)은 무조건 가장 커야함

 

 

검증

    if old < latest:
        print('No')
    else:
        print('Yes')
  • old와 latest로 비교