(Java) 백준 11047 - 동전 0

2022. 5. 11. 03:40·코딩 테스트

그리디 알고리즘을 이용하는 문제이다.

먼저 가장 큰 단위의 동전으로 낼 수 있을 만큼 내고

다음 동전의 단위로 넘어가서 또 낼수 있을 만큼 내면 된다.

이렇게 k의 값을 줄여나가다 보면 필요한 동전의 최소 개수가 나오게 된다.

예전에 그리디 알고리즘을 처음 접했을때 비슷한 문제를 풀어봤던 기억이 나서 쉽게 풀었다.

 

 


최종 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        int answer = 0;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // n과 k를 분리하기 위한 StringTokenizer
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        // k를 담는 배열
        Integer[] coin = new Integer[n];
        for (int i = 0; i < n; i++) {
            coin[i] = Integer.parseInt(br.readLine());
        }
        // 내림차순으로 정렬
        Arrays.sort(coin, Collections.reverseOrder());
        // 가장 큰 동전의 단위로 낼수 있는 만큼 내고 다음 동전 단위로 넘어가기
        int i = 0;
        while (k != 0) {
            if(k - coin[i] >= 0) {
                k = k - coin[i];
                answer++;
            } else {
                i++;
            }
        }
        System.out.println(answer);
    }
}

 

내림차순으로 정렬을 하지않고 while문을 for문으로 바꿔서 풀면 속도가 더 빠르다.

 

다른 방식 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		int answer = 0;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // n과 k를 분리하기 위한 StringTokenizer
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        // k를 담는 배열
        Integer[] coin = new Integer[n];
        for (int i = 0; i < n; i++) {
            coin[i] = Integer.parseInt(br.readLine());
        }
		// for문 사용
		for(int i=n-1;i>=0;i--) {
			if(k>=coin[i]) {
				answer+=k/coin[i];
				k=k%coin[i];
			}
		}
		System.out.println(answer);
	}

}

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

(Java) 백준 2579 - 계단 오르기  (0) 2022.05.13
(Java) 백준 2606 - 바이러스  (0) 2022.05.11
(Java) 백준 9095 - 1, 2, 3 더하기  (0) 2022.05.10
(Java) 백준 11399 - ATM  (0) 2022.05.10
(Java) 백준 1463 - 1로 만들기  (0) 2022.05.07
'코딩 테스트' 카테고리의 다른 글
  • (Java) 백준 2579 - 계단 오르기
  • (Java) 백준 2606 - 바이러스
  • (Java) 백준 9095 - 1, 2, 3 더하기
  • (Java) 백준 11399 - ATM
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 백준 11047 - 동전 0
상단으로

티스토리툴바