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로 비교