안녕하세요!

FE 개발자 유진주입니다.

Language/Python

백준 11047번 동전 0 (Python)

ypearl 2023. 1. 24. 15:38

11047번: 동전 0 (acmicpc.net)

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

첫 번째 문제점: 반복문 작동 오류

계속해서 k값이 변화없이, count 값도 초기값 0 그대로 출력되는 결과 발생.

찾아보니, for문의 range 범위 설정에 문제가 있었다!

아래는 코딩도장의 for와 range의 제대로 된 문법을 찾아왔다.

COS Pro 2급 파이썬: 15.4 숫자를 감소시키기 (dojang.io)

 

 

즉, range의 기본 설정은 증가폭이 양수로 되어있기에, 역순으로 범위를 생성하려면

1) 증가폭을 음수로 따로 지정해주어야 한다. 혹은 2) reversed를 사용해 숫자를 반대로 뒤집는 방법도 있다.

====================================================================

15.4 숫자를 감소시키기

>>> for i in range(10, 0):    # range(10, 0)은 동작하지 않음
...     print('Hello, world!', i)
...
>>> for i in range(10, 0, -1):    # 10에서 1까지 역순으로 숫자 생성
...     print('Hello, world!', i)
...
Hello, world! 10
Hello, world! 9
Hello, world! 8
... (생략)
Hello, world! 2
Hello, world! 1
>>> for i in reversed(range(10)):    # range에 reversed를 사용하여 숫자의 순서를 반대로 뒤집음
...     print('Hello, world!', i)    # 9부터 0까지 10번 반복
...
Hello, world! 9
Hello, world! 8
Hello, world! 7
... (생략)
Hello, world! 1
Hello, world! 0

======================================================================================

 

두 번째 문제점: 조건문 설정 오류

k>l[i]가 아닌, k>=l[i]로 등호까지 조건식에 넣어줬어야 제대로 된 결과가 나오게 된다.

반례를 잘 생각해서 조건식을 다시 한 번 검토하는 습관을 기르자!

import sys
input=sys.stdin.readline
n,k=map(int, input().split())
count=0
l=[]
for i in range(n):
  l.append(int(input()))

for j in range(n-1, -1, -1): #range 역순 범위 설정
  if k>=l[j]: #조건식 등호까지!
    count+=k//l[j]
    k%=l[j]
  if k==0: break

print(count)