Algorithm/λ°±μ€€

λ°±μ€€ 1072번 - κ²Œμž„

giraffe_ 2022. 3. 30. 15:50

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

 

1072번: κ²Œμž„

κΉ€ν˜•νƒμ€ μ§€κΈˆ λͺ°λž˜ Spider Solitaire(μŠ€νŒŒμ΄λ” μΉ΄λ“œλ†€μ΄)λ₯Ό ν•˜κ³  μžˆλ‹€. ν˜•νƒμ΄λŠ” 이 κ²Œμž„μ„ 이길 λ•Œλ„ μžˆμ—ˆμ§€λ§Œ, 질 λ•Œλ„ μžˆμ—ˆλ‹€. λˆ„κ΅°κ°€μ˜ μ‹œμ„ μ΄ λŠκ»΄μ§„ ν˜•νƒμ΄λŠ” κ²Œμž„μ„ μ€‘λ‹¨ν•˜κ³  코딩을 ν•˜κΈ° μ‹œ

www.acmicpc.net

 

 

 

 

 

이뢄탐색 λ¬Έμ œμ΄λ‹€. μ²˜μŒμ— 이게 μ™œ 이뢄탐색 μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμΈμ§€ 감이 μ•ˆ μž‘ν˜”μ§€λ§Œ..

 

1μ”© λ”ν•΄κ°€λ©΄μ„œ 승λ₯ μ΄ λ°”λ€ŒλŠ”μ§€ μ•ˆλ°”λ€ŒλŠ”μ§€ 확인을 ν•œλ‹€λ©΄, X Yκ°€ 클 경우 λ§Žμ€ μ‹œκ°„μ΄ 걸릴 κ²ƒμ΄λΌλŠ” 생각이 λ“€μ—ˆλ‹€. 이뢄탐색 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ λ°˜μ”© λ²”μœ„λ“€μ„ μ’ν˜€κ°€λ©° 찾으면 효율적일 것이닀.

 

 

νƒμƒ‰ν•˜λŠ” 수λ₯Ό 'κ²Œμž„μ„ λͺ‡ 판 더 ν•΄μ•Όν•˜λŠ”μ§€'둜 λ‘”λ‹€. 그리고 κ·Έ 수둜 승λ₯ (Z)λ₯Ό κ΅¬ν•œλ‹€. Zκ°€ λ°”λ€Œμ§€μ•Šμ•˜μœΌλ©΄ low값을 올리고, λ°”λ€Œμ—ˆλ‹€λ©΄ high 값을 내리고 닡을 κ°±μ‹ ν•΄λ‚˜κ°„λ‹€.

 

정닡을 λ„μΆœν•˜λŠ” 데 μ£Όμ˜ν•  점은 Z값이 μ ˆλŒ€ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ -1을 좜λ ₯ν•˜λŠ” 뢀뢄이닀.

μ²˜μŒμ—λŠ” 승λ₯ μ΄ 100일 λ•Œμ˜ 경우만 μžˆλ‹€κ³  μƒκ°ν–ˆμ§€λ§Œ, 99인 κ²½μš°λ„ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

 

 

 

 

 μ½”λ“œ

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

public class Game {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] input = br.readLine().split(" ");
		long X = Integer.parseInt(input[0]);
		long Y = Integer.parseInt(input[1]);
		
		long Z1 = (Y * 100) / X;
		long Z2 = (Y * 100) / X;
		
		long answer = 0;
		long low = 1; //μΆ”κ°€ν•˜λŠ” 판 수 μ΅œμ†Ÿκ°’
		long high = X; //μ΅œλŒ“κ°’
		
		if(Z1 >= 99) { //Zκ°€ μ ˆλŒ€ λ³€ν•˜μ§€ μ•ŠμŒ
			answer = -1;
		} else {
			while(low <= high) {
				long mid = (low + high) / 2;
				
				Z2 = ((Y + mid) * 100) / (X + mid);
				
				if(Z2 < Z1 + 1) { //Zκ°€ λ°”λ€Œμ§€ X
					low = mid + 1;
				} else { //Zκ°€ λ°”λ€Œλ©΄
					high = mid - 1;
					answer = mid;
				}
			}
		}
		
		System.out.println(answer);
	}

}

 

 

 

 

 

κ²°κ³Ό