fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 28682 (C++) 재우야 임관하자
최초 업로드: 2025-10-24 16:33:00
최근 수정 시간: 2025-10-24 16:33:00
게시자: rlatjwls3333
카테고리: 백준
조회수: 19
# [Bronze I] 재우야 임관하자 [문제 링크](https://www.acmicpc.net/problem/28682) ## 문제 설명 <p><u><strong>이 문제는 인터랙티브 문제이다. 아래 노트에 나와 있는 방식으로 입출력을 진행해야 한다.</strong></u></p> <p>2023년 2학기, 드디어 고려대학교에 드랍(수강포기제)이 부활한다! 이번 학기를 마치고 졸업하는 사이버국방학과 재우는 원래도 DP 문제를 좋아했는데, 최근에 시즌 2가 나온 드라마 <D.P.> 시리즈를 보고 졸업 후 장교로 임관하기로 마음먹었다. 재우는 임관을 위해 최대 3개까지 수강할 수 있는 운동 과목을 수강하기로 했다. <a href="https://www.acmicpc.net/problem/27309">작년에 F를 받은 “수영” 과목</a>의 재수강은 물론, “축구”와 “볼링” 과목까지 최대로 수강하게 되었다.</p> <p>드랍을 할 수 있는 날이 다가오자, 재우는 갑자기 <a href="https://www.acmicpc.net/problem/27309">작년에 수영을 F 받은 기억</a>이 떠올라 PTSD가 왔다. 이에 재우는 지도 교수님께 면담을 요청했고, 재우의 정보를 보던 교수님께서는 재우가 세 과목 중 두 과목을 F를 받고 한 과목만 <code>Pass</code>를 받을 수 있다는 사실을 알게 되었다. 원래는 이를 알려주면 안되지만, 재우를 딱하게 생각한 교수님은 한 가지 생각을 한다. 바로 재우가 좋아하는 <D.P. 시즌 1>에서 나온 몬티홀 문제로 주기로 한 것이다!</p> <p>이제 재우는 다음과 같은 과정을 통해 정보를 얻을 수 있다.</p> <ol> <li>먼저, 재우가 <code>Pass</code>로 예상되는 과목 하나를 교수님께 말씀드린다.</li> <li>그러면 교수님께서 재우에게 그 과목을 제외한 다른 두 과목 중 F를 받는 과목 하나를 알려주신다.</li> </ol> <p>재우는 이 정보를 통해 두 과목을 드랍하고, 남은 한 과목을 수강하기로 하였다. 재우는 남은 한 과목이 <code>Pass</code> 받기를 원한다. 재우가 되어 그 과목을 찾아보자.</p> <p>총 $1\,500$개의 독립적인 평행 세계가 존재해 각 평행 세계의 재우는 위의 결정을 해야 한다. 각각의 평행 세계에 대해 프로그램 시작 시 재우가 <code>Pass</code>를 받을 과목 하나가 독립적으로 $\frac{1}{3}$의 확률로 결정된다.</p> <p>각 평행 세계에 대해 위의 1번과 2번 과정은 모두 다른 세계와 독립적으로 진행된다.</p> <p>아래 인터랙티브 과정을 거쳐 $1\,500$개의 독립적인 평행 세계에 존재하는 재우 중 총 $900$명 이상의 최종적으로 예상한 과목이 프로그램이 정한 과목과 같아 재우가 <code>Pass</code>를 받았다면 정답이다. 모든 평행 세계의 행동은 독립적으로 시행된다. 만약 해당 문제의 해답을 모르겠다면, 아래 <strong>노트</strong>를 읽어보자.</p> ## 입력 <p>프로그램이 시작되면 먼저 평행 세계의 개수 $n = 1\,500$을 입력받는다.</p> <p>$n$개의 평행 세계에 대해 <code>Pass</code>로 예상되는 과목을 <span style="color:#e74c3c;"><code>swimming</code></span>, <span style="color:#e74c3c;"><code>bowling</code></span>, <span style="color:#e74c3c;"><code>soccer</code></span> 중 각각 하나씩 골라 한 줄에 공백으로 구분된 $n$개의 과목 이름을 출력한다. (이 과정 직후 flush한다)</p> <p>그럼 프로그램은 각 평행 세계에 대해 고른 과목을 제외한 과목 두 개 중 F인 과목 이름을 하나씩 공백으로 구분하여 준다.</p> <p>이 정보를 토대로 최종적으로 각 평행 세계에 대해 <code>Pass</code>로 예상되는 과목의 이름을 한 줄에 공백으로 구분하여 출력한다. (이 과정 직후 flush한다)</p> <p>예제는 평행 세계가 $n=4$개 존재할 때의 예시이며 예제는 채점하지 않는다. 실제로 프로그램은 $n=1\,500$개인 입력에 대해서 정확히 한 번 실행된다.</p> ## 노트 <p>인터랙티브 문제의 경우 출력을 하고, 언어에 따라 아래와 같은 명령어를 바로 다음에 적어 출력 버퍼를 flush해 줘야 한다.</p> <ul> <li>C: <code>fflush(stdout);</code></li> <li>C++: <code>fflush(stdout);</code> 혹은 <code>std::cout << std::flush;</code></li> <li>Java: <code>System.out.flush();</code></li> <li>Python: <code>sys.stdout.flush()</code></li> <li>Kotlin: <code>System.out.flush()</code></li> </ul> <p>남은 두 과목 중 하나를 고르게 되므로 재우가 <code>Pass</code>를 받을 확률이 $\frac{1}{2}$인데 어떻게 $1\,500$개 중 $900$개나 예상할 수 있는지 의문을 가질 수 있다. <D.P. 시즌 1> 4화의 몬티홀 문제를 설명하는 허치도 병장과 관련된 다음 두 장면을 보며 그 방법을 알아보자.</p> <ul> <li>장면 1(군대 내 후임과의 대화에서) <ul> <li>치도 : 자, 여기에 세 개의 문이 있어. 이 문들 중 하나를 열고 들어가면 5박 6일 포상 휴가증이 있어. 영식이 하나 골라 봐.</li> <li>(영식이 1번 문을 고른다)</li> <li>치도 : 오케이, 영식이가 1번 문을 골랐어. 근데 고르고 보니까 3번 문이 꽝이라는 걸 알게 됐어. 그럼 내가 다시 한번 물어볼게. 영식이 너는 계속 1번 문을 고른 선택을 유지할래? 아니면 2번 문으로 바꿔 볼래?</li> <li>영식 : 안 바꿉니다. 안 바꿉니다, 안 바꿔요.</li> <li>치도 : 왜? 내가 속일까봐? 아니면 바꿨다 휴가증 없으면 멘붕 오니까?</li> <li>영식 : 에이, 어차피, 뭐 반반 무 많이 아닙니까? 있거나, 없거나.</li> <li>치도 : 진짜? 자, 답은 ...</li> </ul> </li> <li>장면 2(대학교 수업 중) <ul> <li>치도 : 정답은 ‘선택을 바꿔야 한다’입니다.</li> <li>교수 : 나와서 설명해 봐.</li> <li>치도 : 통계학에 근거합니다. 최초 세 개의 문 중 하나를 골랐을 때 당첨될 확률은 $\frac{1}{3}$.</li> <li>(최초 고른 문을 제외한 한 문에 <code>X</code>를 치고, 둘을 묶어 <code>+</code>기호를 그린다)</li> <li><strong>치도 : 다른 하나가 꽝인 걸 알고 선택을 바꾸게 됐을 땐 반반이 아닌 </strong>$\frac{2}{3}$<strong>의 확률이 됩니다. 첫 선택 후 알게 된 꽝이라는 변수는 제가 처음 어떤 문을 선택했느냐에 따라 영향을 받고 달라지는 거니까요, 고로 정답은 ‘선택을 바꿔야 한다’입니다.</strong></li> <li>교수 : 정답.</li> </ul> </li> </ul> <p>따라서 선택을 바꾸면 재우가 <code>Pass</code>를 받을 확률이 $\frac{2}{3}$의 확률이 되며, $1\,500$개의 평행 세계 중 <code>Pass</code>를 받는 평행 세계의 기댓값은 $1\,000$개다.</p> <p>즉, 위의 전략처럼 처음 출력한 것과 다른 선택을 하게 되면, 평균적으로 $1\,500$개 중 $1\,000$개를 맞을 것을 기대할 수 있다는 의미이다.</p> <p>만약 정말 운이 좋지 않아 해당 전략을 사용했음에도 $900$개 미만을 맞을 확률을 계산해보면, $0.00000286\%$정도로, 이 확률은 어떤 사람이 평생 로또를 딱 한번 샀는데 1등에 당첨될 확률(약 $0.0000123\%$)보다 약 $4.3$배 정도 낮으므로, 혹시나 해당 전략을 사용했는데 틀렸다면 한 번 더 제출한 뒤 오늘 로또를 사도록 하자.</p> ## 풀이 몬티홀을 이해하는 문제입니다. 임의의 하나를 물어보고 선택된 결과를 바꿨을 때, 2/3 확률로 정답을 맞추기에 n=1500인 이 문제에서는 평균적으로 1000개가 맞을 것입니다. ``` c++ #include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int i=0;i<n;i++) cout << "swimming "; cout << '\n' << flush; for(int i=0;i<n;i++) { string s; cin >> s; if(s[0]=='b') cout << "soccer "; else cout << "bowling "; } cout << '\n' << flush; } ```