Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

시간이 NullNull

[JAVA] [SWEA] 9700. USB 꽂기의 미스터리 본문

알고리즘

[JAVA] [SWEA] 9700. USB 꽂기의 미스터리

4NIng 2020. 5. 12. 22:35

정우는 USB 커넥터를 포트에 꽂고 있다. 정확히 꽂기 까지 다음과 같은 과정을 거친다.

 

- 가장 처음 USB를 꽂을 때, p의 확률로 올바른 면으로 USB를꽂은 것이고 ,
    (1 - p)의 확률로는 뒤집어서 USB를 꽂은 것이다.

 

- 만약 올바른 면으로 USB를 꽂으면 q의 확률로 정상적으로 USB가 꽂히고,
    (1 - q)의 확률로는 꽂히지 않는다. USB가 뒤집어져 있다면 절대로 꽂히지 않는다.

 

- USB를 꽂는 것을 실패하면 USB를 뒤집은 다음 다시 꽂는 것을 시도한다.

 

 

이 때, USB를 정확히 i번 뒤집었을 때 USB가 꽂힐 확률을 si 로 나타낸다.

정우는 지금까지 USB를 두 번이나 뒤집어야 USB가 제대로 꽂히는 놀라운 경험을 너무 많이 했고, 이런 상황이 얼마나 많이 일어날 수 있는지 알고 싶다.

이를 위해 p, q가 주어지면 s1< s2인지 아닌지 판별하는 프로그램을 작성하라.

 

 

 

처음에 이게 무슨 멍소리인가 엄청 고민을 했었다.

 

(항상 느끼는 거지만 그냥 계산하지말고 꽂아라.... 제발...)

 

사실 엄청 고민하다가 결론을 내보았는데 간단하였다..... 그래서 엄청 허무한 문제였다.

 

왜 정답률이 높고 D3인지 체감해주게 하는 문제

 

1. S1의 경우

 

쉽게 표현하면 첫번째에 못 꽂아서 뒤집어서 꽂았더니 꽂히는 경우이다.

 

그럴경우 정말 쉽게도 1번 뒤집어서 꼽혔으니 뒤집기 전에는 뒤집어져 있던 상태이다.

 

그래서 1 * (1-p)

 

거기다가 뒤집어서 꽂혔으니 q의 확률로 정상적으로 usb가 꽂힌 것이다.

 

그래서 1*(1-p)*q

 

2. S2의 경우 

 

마찬가지로 두번 뒤집어서 꽂아야 한다. 그렇다면 생각해보면

 

처음에 제대로된 면 -> 한번 뒤집음 -> 올바른 면 아님 -> 다시 뒤집음 꼽힘

 

결론은 맨 처음에는 올바른 면이라는 것으로 1 * p 이다.

 

첫번째에 올바른 면인 상태에서 꽂히지 않은 상태임으로 1 * p * (1-q)

 

한번 뒤집었을때 올바른 면이 아니기에 무슨 짓을 하더라고 꽂히지가 않고

 

두번째 뒤집었을때 q의 확률로 꼽히므로

 

1 * p * (1-q) * q

 

그래서 이 S1과 S2를 비교해주면 문제가 풀리는 단순한 문제이다.

 

전체 소스 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Solution9700 {

	public static void main(String[] args) throws Exception{		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int T = Integer.parseInt(br.readLine());
		for(int t=1; t<=T; ++t) {
			String[] str = br.readLine().split(" ");
			double p = Double.parseDouble(str[0]);
			double q = Double.parseDouble(str[1]);
			String result = "YES";
			
			double s1 = (1-p)*q;
			double s2 = p*(1-q)*q;
			if(s1 >= s2) {
				result = "NO";
			}
			bw.write("#"+t+" "+result+"\n");
		}
		bw.close();
		br.close();

	}

}
Comments