본문 바로가기

코딩테스트

백준 2720번 세탁소 사장 동혁 문제 풀이

728x90

https://www.acmicpc.net/problem/2720

 

문제 요약: 주어진 금액을 동전(쿼터, 다임, 니켈, 페니)으로 바꿀 때, 각 동전의 개수를 구하는 문제입니다.

기본 풀이

먼저, 기본적인 접근 방식은 다음과 같습니다

Z = int(input())

for a in range(Z):
    C = int(input())
    for i in [25, 10, 5, 1]:
        count = C // i  
        print(count, end=" ")  
        C = C % i  
    print()
  • - 어차피 금액 단위가 정해져 있으니, 큰 단위부터 몫을 반환하고 나머지를 다시 금액으로 할당, 이 과정을 반복하면 되는 문제였다.
    - 처음에는 반복 과정에서 for문을 쓰지 않고 그냥 quarter = c // 25, dime = (c - 25*quarter - 10*dime) // 5 이런식으로 단순하게 접근했었는데, 생각해보니까 어차피 금액 단위가 정해져 있다는 사실을 알고 이를 활용해서 이중 for문을 생각했던 것 같다.

- 풀이를 마치고 다른사람들이 한 코드를 보는 와중 신기한 방법을 쓰신분을 발견해서 올려보겠다.

for i in range(T):
    result = []
    C = int(input())
    quarter = (C // 25)
    left_q = C % 25
    result.append(int(quarter))
    
    dime = (left_q // 10)
    left_d = left_q % 10
    result.append(int(dime))
    
    nickel = (left_d // 5)
    left_n = left_d % 5
    result.append(int(nickel))
    
    penny = (left_n // 1)
    left_p = left_n % 1
    result.append(int(penny))
    
    final.append(result)

for i in final:
    print(*i)

 

- 위에서 받은 입력값 T 만큼 반복을 진행하고
- 이때 각 반복에 해당하는 결과를 리스트에 담고자 result 변수를 선언했다. 반복할때마다 새로 선언되어 새로운 경우 반영함에 주목.
- 거스름돈을 나타내는 C는 정수로 이루어져 있기 때문에 이에 맞춰 쿼터, 다임, 니켈, 페니의 단위도 정수로 바꿔주었다.
- 쿼터, 다임, 니켈, 페니 순서대로 필요한 개수를 출력하기 위해 계산할 때도 같은 순서로 진행한다.
- 이때 각 순서의 앞에서 얻은 몫 값은 해당 단위의 개수에 해당하고 나머지는 그 다음 단위의 개수 계산에 영항을 미침에 주의.
- 그래서 쿼터, 다임에 해당하는 코드를 보면 C의 몫은 쿼터의 개수 , C의 나머지는 다임의 개수 계산에 영향을 미치게 된다.
- 최종적으로 각 입력에 해당하는 결과값을 result 에 담고 이를 final 리스트에 넣는다.
- 결국 i에서 final리스트의 0번째 요소부터 차례대로 들어가는데, 이때 각 테스트케이스에 해당하는 리스트 결과값을 반환하게 되는 것이다.
- 여기서 특이한게 이 분은 출력할때 리스트를 의미하는 대괄호를 없애기 위해서 `Asterisk`를 사용했다는 것이다.

에스터리스크(*)의 역할

  1. 리스트 언팩킹 : *i를 사용하면 i의 모든 요소가 개별 인자로 취급된다. ex) i가 [1,2,3]이라면 print(*i)는 실제로 print(1,2,3)과 동일한 효과를 내는 것이다.
  2. 가독성 향상 : 이 방식은 여러 값을 한 번에 출력하는 경우 코드가 더 간결하고 읽기 쉽게 만들어주는 효과를 가진다.
  3. 유연성 : 리스트의 길이에 관계없이 모든 요소를 출력할 수 있기 때문에, 고정된 수의 인자를 다루는 것보다 훨씬 유연하게 사용될 수 있다고 한다.
final = [
    [2, 1, 0, 3],  # 첫 번째 테스트 케이스 결과
    [1, 0, 0, 4],  # 두 번째 테스트 케이스 결과
]

- 위와같이 `final 리스트` 형태라 가정하면
- `print(*i)`는 아래와 같이 출력된다.

2 1 0 3
1 0 0 4

이러한 방식으로 각 동전의 개수를 개별적으로 출력할 수 있습니다.

 

 

 

 

728x90

'코딩테스트' 카테고리의 다른 글

백준 2869 : 달팽이는 올라가고 싶다.  (1) 2024.09.26
백준 1193 : 분수찾기  (0) 2024.09.26
백준 1062번 가르침  (0) 2024.09.24
백준 2903번 중앙 이동 알고리즘  (0) 2024.09.23
백준 2745번 진법변환문제  (0) 2024.09.19