본문 바로가기

JAVA/백준

백준 11047번: 동전 0

728x90
반응형

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

N종류의 동전을 가지고 가장 적은 수의 동전으로 K값을 정확히 만들어내는 문제이다.

 

어떤 값을 만들 때 그것보다 가장 작은 값 중의 가장 큰 값을 찾아야 했다.

이전에 TreeMap을 사용하면서 higher, lower에 관한 메소드가 있던 것으로 기억해서 TreeSet을 찾아봤다.

생각대로 TreeSet에 higher, lower 메소드가 있었고 그걸 이용해서

입력받은 K값의 나머지가 0가 될 때 까지 반복문을 돌리면서 가장 적은 수로 K를 만드는 법을 찾았다.

 

그렇게 만들고 몇 번 실행해봤을 때 내가 관과한 사실이 있다는 것을 깨달았는데,

바로 값K가 동전의 값과 일치할 때를 고려하지 않았다는 것이다.

(예를 들면 100원 동전이 있는데 100을 입력받은 경우)

lower 메소드는 입력받은 값보다 미만의 값 중 최대값을 골라주기 때문에 문제가 발생했다.

그래서 contains 메소드로  K값이 TreeSet에 포함되는지 확인하고

만약 그렇다면 반복문을 통과하고, 동전의 수를 1증가하도록 만들어주어 문제를 풀 수 있었다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    int N = Integer.parseInt(st.nextToken());
    int value = Integer.parseInt(st.nextToken());
    TreeSet<Integer> ts = new TreeSet<>();
    int ctr = 0;

    for (int i = 0; i < N; i++) 
      ts.add(Integer.parseInt(br.readLine()));
    br.close();

    while (value > 0) {
      if (ts.contains(value)) {
        value %= value;
        ctr++;
      }
      else {
        ctr += value / ts.lower(value);
        value %= ts.lower(value);
      }
    }

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    bw.write( ctr + "\n");
    bw.flush();
    bw.close(); 
  }
}
반응형

'JAVA > 백준' 카테고리의 다른 글

백준 17219번: 비밀번호 찾기  (0) 2024.05.05
백준 11399번: ATM  (0) 2024.05.04
백준 1764번: 듣보잡  (0) 2024.05.02
백준 1620번: 나는야 포켓몬 마스터 이다솜  (1) 2024.05.01
백준 11723번: 집합  (0) 2024.04.30