알고리즘 풀이

[알고리즘] 백준 | 공 넣기

째깍단 2023. 9. 4. 08:55

공 넣기

답: 

더보기
from sys import stdin

input = stdin.readline
N, M = map(int, input().split())

bucket = ["0"] * N
for _ in range(M):
    i, j, k = map(int, input().split())
    for num in range(i-1, j):
        bucket[num] = f"{k}"
        
print(" ".join(bucket))

 

 

from sys import stdin

input = stdin.readline
N, M = map(int, input().split())

bucket = [0] * N
for _ in range(M):
    i, j, k = map(int, input().split())
    for num in range(i-1, j):
        bucket[num] = k
print(" ".join(map(str, bucket)))

 

 

문제 분석 및 해석

 

각각의 바구니에는 번호가 있다  1번 ~ N번 

1번부터 N번까지 번호가 적혀있는 공을 가지고 있다

바구니에는 공이 들어있지 않으며, 각 바구니에는 공을 1개만 넣을 수 있다

 

M번 공을 넣으려고 한다 (횟수)

도현이는 한 번 공을 넣을 때 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다

만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고 새로운 공을 넣는다. 공을 넣을 바구니는 연속된다.

 

-----

 

N개의 바구니, M개의 줄 (공을 넣을 횟수)

M개의 줄에 걸쳐서 공을 넣는 방법 : 각 방법은 세 정수 i j k, i번 바구니부터 j번 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다

바구니에 공이 있으면 공을 빼고 넣기

 

입력 :

5 4

1 2 3

3 4 4

1 4 1

2 2 2

 

출력 :

1 2 1 1 0

공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0 출력

 

 

 

>> 풀이생각

 

배열, 1~N... 0번을 넣던지, 빼고 전체 숫자를 -1로 생각하고 풀기

for 문으로 해당 input 그때그때 받으면서 공을 바구니에 넣어주자

 

 

 

 

풀이 중 오류

 

1) 기껏 잘 구해놓고 출력 타입을 제대로 확인 안하고 제출함 ..

 

써놓으면 부끄러운 만큼 앞으론 안하겠지

print(bucket)

 

## 조건 1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.

입출력을 잘 읽자...

 

 

 

 

2) TypeError발생

 

print(" ".join(bucket))

 

print(" ".join(bucket))

         ^^^^^^^^^^^^^^^^

TypeError: sequence item 0: expected str instance, int found

 

 = str값을 기대했지만, int 값이어서 join할 수 없었다

배열에 든 값은 숫자기 때문에 문제가 생김

 

 

 

 

해결방법 1. #성공

print문에서 map으로 str값으로 다시 바꾸어 결과내주기

for _ in range(M):
    i, j, k = map(int, input().split())
	...
    
print(" ".join(map(str, bucket)))

이중으로 map을 사용하는것이어서 별로 좋은 코드는 아니다

 

 

 

해결방법 2. #오류

처음 문자열을 받을때  int값으로 바꾸지 않고 변수에 받기

 

range문에 문자열을 넣기때문에 문제가 생긴다

 

 

 

해결방법 3. #성공

map함수로 int로 받되 k를 배열에 넣을 때 f string으로 문자열로 변환해 넣어줬다.

bucket = ["0"] * N  ##여기도 변경해주어야한다. 일반 숫자 0인경우 런타임에러 발생

for _ in range(M):
    i, j, k = map(int, input().split())
    for num in range(i-1, j):
        bucket[num] = f"{k}"

print(" ".join(bucket))

 

 

해결방법 4. #성공

print(*bucket)

 

 

 

리뷰.

 

문제 설명이 복잡하게 되어있지만 차근차근 생각하면 그리 어려운 문제는 아니었다

 

출력 값을 잘 확인하고 제출하자!