ahlight
개발 저장소
ahlight
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • Java (7)
    • Spring (5)
    • JPA (2)
    • JavaScript (0)
    • Computer Science (12)
      • 디자인패턴, 프로그래밍 패러다임 (1)
      • 네트워크 (4)
      • 운영체제 (4)
      • 데이터베이스 (3)
      • 자료구조 (0)
    • 알고리즘 (1)
    • 프로그래머스 (13)
    • 백준 (94)
    • 서평 (3)
    • 회고 (1)
    • TIL (58)
    • 기타 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 넥스트스텝
  • 라즈베리파이4 #홈서버 #포트포워딩 #dhcp
  • TDD
  • Java
  • 클린코드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ahlight

개발 저장소

백준

백준 11047번 자바

2023. 2. 11. 18:43

문제

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

 

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

 

1. 접근방식

전형적인 그리디 방식의 문제다. 

그리디 문제에서 가장 중요한 점은 매 분기에서 가장 좋은 선택을 하며, 이전 선택의 결과가 이후 선택의 결과에 영향을 미치지 않는다는 것이다.

 

해당 문제의 경우 

임의의 동전의 가치 Ai로 K원을 나눴을 때 몫이 1이상인 경우를 먼저 찾은 뒤 

몫 x Ai원을 K원에서 빼준다. 이후엔 같은 방식으로 해결하면 된다.

 

예제를 기준으로 1000원을 선택하고 K원에서 나눠준 몫 4를 곱해준다.

K원에서 4000원을 빼준 뒤 남은 200원에서 동전의 가치가 100원인 동전을 선택한다.

이전 선택인 1000원이 다음 선택인 200원에 영향을 주지 않는다.

 

 

2. 구현

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

public class Main11047 {
	static int N,K;
	static int[] coins;
	static int max;
	static int cnt;

	public static void main(String[] args) throws IOException {	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		coins = new int[N];
		for (int i=0; i<N; i++) {
			coins[i] = Integer.parseInt(br.readLine());
			if (max < coins[i] && coins[i] <= K) {
				max = coins[i];
			}
		}
		while (K > 0) {
			K = K - max;
			cnt++;
			
			if (K < max) {
				for (int i=N-1; i>=0; i--) {
					if (coins[i] <= K) {
						max = coins[i];
						break;
					}
				}
			}
		}
		System.out.println(cnt);
	}
}

 

정리 :

어렵지 않게 풀었으나 다른 코드들을 보니 내가 만든 코드를 더 간결하게 만들 수 있는 방법이 있었다.

내 코드의 경우 몫만큼 반복문을 돌리기에 범위값이 커지면 그 만큼 더 많은 시간이 더 소요된다.

연산 한번으로 끝낼 수 있는 부분을 반복문으로 돌렸기에 반쪽짜리 통과라 생각이 든다..

아래에 해당 부분을 첨부해 복기하자.

for(int i = N - 1; i >= 0; i--) {
 
			// 현재 동전의 가치가 K보다 작거나 같아야지 구성가능하다.
			if(coin[i] <= K) {
				// 현재 가치의 동전으로 구성할 수 있는 개수를 더해준다.
				count += (K / coin[i]);
				K = K % coin[i];
			}
		}
출처 : https://st-lab.tistory.com/143

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

백준 1929번 자바  (0) 2023.02.15
백준 1744번 자바 ☆  (0) 2023.02.11
백준 1715번 자바 ☆  (0) 2023.02.08
백준 1300번 자바 ☆  (0) 2023.02.07
백준 2343번 자바 ☆  (0) 2023.02.07
    '백준' 카테고리의 다른 글
    • 백준 1929번 자바
    • 백준 1744번 자바 ☆
    • 백준 1715번 자바 ☆
    • 백준 1300번 자바 ☆
    ahlight
    ahlight

    티스토리툴바