[SW Expert Academy] 9611 명진이와 동휘의 숫자 맞추기[D3]

이성훈·2023년 5월 2일
0

SW Expert Acadamy

목록 보기
1/2

문제

명진이와 동휘가 숫자 맞추기 게임을 한다.

게임 방법은 명진이가 0 에서 9 사이의 숫자를 하나 생각하면, 동휘가 질문을 통해 명진이가 생각한 숫자가 어떤 것인지 맞추는 것이다.

동휘는 명진이가 생각한 숫자를 맞추는 데 총 N번의 질문 했다.

동휘는 질문을 한 번 할 때, 네 개의 숫자 중에 명진이가 생각한 숫자가 있는지 물어볼 수 있다.

명진이는 이 네 숫자 중에서 자신이 생각하는 숫자가 있으면 YES를, 아니면 NO를 답해 준다.

명진이가 생각한 숫자가 어떤 숫자인지 구하는 프로그램을 작성하라.

입력

첫 번째 줄에 테스트 케이스의 수 TC가 주어진다.

이후 TC개의 테스트 케이스가 새 줄로 구분되어 주어진다.

각 테스트 케이스는 다음과 같이 구성되어 있다.

각 테스트 케이스의 첫 번째 줄에 동휘가 숫자를 맞추는 데까지 질문한 횟수 N 이 주어진다. (1 ≤ N ≤ 6)

이후 N개의 줄의 각 줄에는 네 개의 정수 a, b, c, d 와 하나의 문자열 S가 공백 하나로 구분되어 주어진다.
(0 ≤ a, b, c, d ≤ 9), 문자열 S 는 “YES”혹은 “NO”중 하나이다.

명진이가 생각한 숫자는 언제나 유일하게 결정됨이 보장되는 경우만 입력으로 주어진다.

출력

각 테스트 케이스마다 ‘#’(는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,

명진이가 생각한 숫자가 어떤 것인지 출력한다..

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

풀이

입력에서 YES와 NO의 입력을 주는데 YES와 NO의 갯수에는 제약이 없다.
따라서
(1) 모두 YES입력인경우 모두 NO인경우 YES와 NO가 섞인경우를 고려해야한다.
또, (2) NO입력을 받은 숫자는 절대로 정답이 될 수 없고,
YES만 입력받은경우 가장 많이 중복되는 원소가 정답이되어야한다.

(1)과 (2)를 통해서 생각해낸것은
처음에 List의 원소를 1로 초기화한뒤, YES입력을 받은경우 임의값으로 배를 하여 저장한뒤
NO입력을 받은경우 그 값을 0으로 초기화하는것.
그러면 0으로된 원소는 배수를 적용해도 0으로 고정이된다.

출력은 모든 입력을 받은후에 최댓값을 가지는 인덱스(원소)를 출력하도록 하면 된다.

#include <cstring>
#include<iostream>
 
using namespace std;
 
int main(int argc, char** argv)
{
    int test_case;
    int T;
    /*
       아래의 freopen 함수는 input.txt 를 read only 형식으로 연 후,
       앞으로 표준 입력(키보드) 대신 input.txt 파일로부터 읽어오겠다는 의미의 코드입니다.
       //여러분이 작성한 코드를 테스트 할 때, 편의를 위해서 input.txt에 입력을 저장한 후,
       freopen 함수를 이용하면 이후 cin 을 수행할 때 표준 입력 대신 파일로부터 입력을 받아올 수 있습니다.
       따라서 테스트를 수행할 때에는 아래 주석을 지우고 이 함수를 사용하셔도 좋습니다.
       freopen 함수를 사용하기 위해서는 #include <cstdio>, 혹은 #include <stdio.h> 가 필요합니다.
       단, 채점을 위해 코드를 제출하실 때에는 반드시 freopen 함수를 지우거나 주석 처리 하셔야 합니다.
    */
    //freopen("input.txt", "r", stdin);
    cin>>T;
    /*
       여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
    */
    for(test_case = 1; test_case <= T; ++test_case)
    {
        /////////////////////////////////////////////////////////////////////////////////////////////
        /*
             이 부분에 여러분의 알고리즘 구현이 들어갑니다.
         */
        /////////////////////////////////////////////////////////////////////////////////////////////
        int N;
        scanf("%d", &N);
        int list[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
        for(int i = 0 ; i < N; i ++){
            int a, b, c, d;
            char ans[5];
            scanf("%d%d%d%d%s", &a, &b, &c, &d, ans);
            if(strcmp(ans, "YES") == 0){ //YES입력을 받은경우 원소값 두배
                list[a] *= 2; 
                list[b] *= 2;
                list[c] *= 2;
                list[d] *= 2;
            }else{ //NO입력을 받은경우 원소값을 0으로 고정 => 2배해도 0이될것.
                list[a] = 0;
                list[b] = 0;
                list[c] = 0;
                list[d] = 0;
            }
        }
         
        //정답출력
        //YES답변을 입력받은경우
        int ans;
        int ansCnt = 0;
        for(int i = 0 ; i < 10 ; i ++){
            if(list[i] > ansCnt){
                ansCnt = list[i];
                ans = i;
            }
        }
        printf("#%d %d\n", test_case, ans);
    }
    return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
profile
I will be a socially developer

0개의 댓글