백준 10810번 바로가기

처음에 문제조건을 잘못 읽어서 공을 계속 추가해서 넣는 줄 알았는데, 알고보니 하나 넣으면 하나 빼는 방식이었다. 문제해결할 때에는 조건을 잘 읽고 헛으로 삽질하지 않도록 유의하자!!

나의 풀이

import sys

n_basket, n_round = map(int, sys.stdin.readline().split())

result = [0] * n_basket

for i in range(n_round):
  start, end, num = map(int, sys.stdin.readline().split())
  for i in range(start, end+1):
    result[i-1] = num

for i in result:
  print(i, end=" ")

for 문을 돌려서 현재 상태를 result에 저장 후 update한 뒤에 최종 결과를 print하는 식으로 작성했다.

고수들의 풀이 참고하기!

f=lambda:map(int,input().split())
n,m=f();b=[0]*n
exec("i,j,k=f();b[i-1:j]=[k]*(j-i+1);"*m)
print(*b)

출처

  1. input 받을 때 매번 적어주는 것보다는 lambda를 활용해서 깔끔하게 적자!
    • f=lambda:map(int, input().split()) 선언 후에 f()로 간편하게 불러올 수 있다. f=lambda:map(int, sys.stdin.readline().split())로도 응용가능
  2. exec는 문자열 안의 코드를 실행하고 return하지 않는다.
    • "”안의 내용을 m번 반복해라
    • i,j,k=f()로 불러오고
    • b의 (i-1)요소부터 (j)요소까지는 [k] 저장
  3. print(*)
    • ans = [1, 2, 3]일 경우 print(*ans)는 1 2 3을 출력한다.

극한의 숏코딩

p,_,*l=map(int,open(0).read().split())
L=[0]*p
while l:p,q,r,*l=l;L[p-1:q]=[r]*(q-p+1)
print(*L)

출처

  1. 심지어 f() 두번 쓰는 것도 귀찮다. 범용성있게 input()받아올랭
    • p, _, *l
    • 세 번째 요소는 있으면 받아오고 없으면 안받아
    • open(0)으로 계속 읽어오깅
  2. 나머진 위의 풀이와 동일. exec 대신 while 쓴 것 뿐이다.