while(1) work();
반응형

링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AXTC4piqD_IDFASe 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

분류

우선순위 큐

 

개인적 난이도

매우 쉬움 쉬움 보통 어려움 매우 어려움

 

핵심 알고리즘

거꾸로 계산하면 편하다.

X = 0에서 시작하지 말고 X = K에서 시작해서

나누기를 해가며 계산한다.

 

시행착오

없음

 

코드

import java.util.*;
import java.io.*;

class Solution{

	public static void main(String args[]) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());

		for(int tc = 1; tc <= T; ++tc){
			int N = Integer.parseInt(br.readLine());
			int[] A = new int[N];
			String[] arr = br.readLine().split(" ");
			int K = Integer.parseInt(br.readLine());

			int min = Integer.MAX_VALUE;
			for (int i = 0; i < N; i++){
				A[i] = Integer.parseInt(arr[i]);
				min = Math.min(A[i], min);
			}

			Queue<Node> pq = new PriorityQueue<Node>();
			pq.add(new Node(K, 0));

			int cnt = K;

			while(!pq.isEmpty()){
				Node n = pq.poll();

				if (n.left == 0){
					cnt = n.cnt;
					break;
				}

				pq.add(new Node(0, n.cnt + n.left));

				for (int i = 0; i < N; i++){
					pq.add(new Node( n.left / A[i], n.cnt + n.left % A[i] ));
				}
			}

			System.out.println("#" + tc + " " + cnt);
		}
	}

	static class Node implements Comparable<Node>{
		int left, cnt;

		public Node(int left, int cnt){
			this.left = left;
			this.cnt = cnt;
		}

		public int compareTo(Node n){
			if (this.cnt > n.cnt) return 1;
			if (this.cnt == n.cnt) return 0;

			return -1;
		}
	}
}
반응형

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

[SW 역량테스트 기출] 13469. 메모장 프로그램  (0) 2022.02.27
2948. 문자열 교집합  (0) 2022.02.16
3000. 중간값 구하기  (0) 2022.02.16
1249. 보급로  (0) 2022.02.16
1248. 공통조상  (0) 2022.02.16
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그