문제 이해 :
입력 :
출력 :
문제 분석
map(type, 값)
N, K = map(int, input().split())
coins
배열 reverse()
N, K = map(int, input().split())
coins = [int(input())for _ in range(N)]
coins.reverse() # 역순으로 코인 사용
ans
변수에, 남은 금액은 K
에 갱신 N, K = map(int, input().split())
coins = [int(input())for _ in range(N)]
coins.reverse() # 역순으로 코인 사용
ans = 0
for coin in coins:
ans += K // coin
K %= coin
print(ans)
11047은 그리디 알고리즘의 가장 쉬운 대표 문제이다.
먼저 본인이 작성한 코드이다.
N, K = input().split()
N = int(N)
K = int(K)
rmnd = K # 나머지 값을 저장하는 변수
coin_count = 0 # 동전 개수를 저장하는 변수
coin_type = [int(input()) for _ in range(N)] # 동전 종류 입력
for i in range(N-1, -1, -1): # 인덱스 접근 N-1 ~ 0
if coin_type[i] <= rmnd: # 동전 금액이 남은 금액보다 작은 경우에 한함
coin_count += rmnd // coin_type[i]
rmnd = rmnd % coin_type[i]
print(coin_count)
처음 코드를 작성했을 때에는 for i in range(N-1, 0, -1)
으로 설정해 주었었고,
for
문 안에서 coin_count
를 체크해주는 분기문 조건을 if coin_type[i] < rmnd
로 설정했었다.
자꾸 너무 바보같은 실수로 오답이 된다 ... 😅
모든 테스트케이스에서 같은 정답이 나옴에도 틀렸다고 뜨는데 역시 컴퓨터는 정확하다.
python의 for _ in range()
문은 range(1, 10)
일 때 1 ~ 9까지(두번째 인자 값 -1까지 적용(양수의 경우)) 적용되는데,
본인은 코드에서 두번째 인자 값을 0으로 설정했기에 가장 큰 단위의 코인부터 가장 작은 단위의 코인보다 하나의 윗 단위까지만 적용된 것이었다.
두번째 실수는 coin_type[i] < rmnd
로 설정해주었기에 coin_type[i]
이 rmnd
와 같은 경우
count 누적을 해주지 못한다는 부분이다.
코딩테스트 준비 하면서 내 신중함을 돌아보게 되고 문제 분석을 더욱 명확히 해야함을 느낀다!
여러모로 굳 ...
마지막으로 강의에서의 코드 접근방식을 통해 python에서 알아두면 정말 유용한 메소드들을 많이 얻어가게 되었다.
N, K = map(int, input().split())
coins = [int(input()) for _ in range(N)]
coins.reverse() # 역순으로 코인 사용
ans = 0
for coin in coins:
ans += K // coin
K %= coin
print(ans)
본인의 경우 반복문을 역순으로 돌려 coin_type
을 체크해주었지만,
배열 리스트에 값을 넣어주고 ARRAY.reverse()
를 통해 역순으로 정렬할 수 있었고
그 결과 로직 부분의 코드가 훨씬 명료해짐을 알게 되었다!
로직을 직관적이게 짜야 디버깅도 쉬워짐을 배운 문제이다.