Programming Language/JAVA

[JAVA] 백준 11047 동전 0 JAVA 문제풀이(feat.더러운 코드)

devRobin 2022. 9. 2. 10:57

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

 


내가 쓴 답안(좋은 답안은 아니라고 생각됩니다)

import java.util.Scanner;

public class Main{
			
	static int forMaxCount = 0;
	static int ordinalNum = 0;
	
	
	public static void main(String[] args) {
				
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt(); //동전 종류 수
		int K = sc.nextInt(); //목표 합

		int[] coinArr = new int[N];
		forMaxCount = N;	
		
		for(int i = 0; i < N; i++) {
			coinArr[i] = sc.nextInt();
		}
		
		int max = 0;
		int sum = 0;
		int cnt = 0;//필요한 동전 개수
		
			
		max = findMax(coinArr, max, K, sum);
			
		while(sum <= K){ 			
			sum += max; 
			cnt++;			
			if(max > K-sum) {
				max = findMax(coinArr, max, K, sum);
			}
			if(sum == K){
				System.out.println(cnt);	
				break;
			}
		}			
				
	}

	
	public static int findMax(int[] coinArr, int max, int K, int sum){
		
		int middleMax =0;
		
		for(int i = 0; i < forMaxCount; i++) {
			if(coinArr[i]<= K-sum && coinArr[i] > middleMax) {
				middleMax = coinArr[i];
				ordinalNum = i;
			}
		}
		
		max = middleMax;
		
		forMaxCount = ordinalNum;
		return max;
	}
	
}

 

 

이번 문제 풀이는 정말 아쉬운 풀이였다.

코드를 너무 더럽게 짰기 때문이다.

클린코드에서 메소드 매개변수를 되도록 넣지말라고 했는데... 나는 무려 4개나 넣어버렸다.

 

 

 

 

시간이 될 때 다음 사항을 개선하거나 알아가야겠다.

1. 메소드 매개변수 최소화하기

2. 배열을 전역변수로 선언하는 방법