개발로 하는 개발

[BOJ] #6997 Guessing Game I 본문

Study

[BOJ] #6997 Guessing Game I

jiwon152 2021. 8. 25. 19:00

문제

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

 숫자 야구와 동일한 시스템이다. 상대가 모르는 우리만 아는 숫자가 'secret', 그리고 상대가 'secret'과 관련된 정보를 얻기 위해 불러주는 숫자가 'guess'. 'secret'과 'guess'를 알려주었을 때 같은 자리에 동일한 숫자가 있으면 동그라미 하나, 다른 자리이지만 동일한 숫자가 있으면 사각형 하나. 이렇게 총 개수를 형식에 맞게 출력해주면 된다.

 

6997번: Guessing Game I

After a long trek through treacherous mountains, Bilbo and the dwarfs have arrived at the West Gate of the mines of Puzzlia, constructed by a mathematically inclined Dwarf King. The gate is of course not open (nothing can be that easy for our heroes), and

www.acmicpc.net


 입력으로는 첫 줄에 테스트 케이스 개수를 알려주고 그 뒤로 각 테스트 케이스에서 정수형태의 secret, guess를 준다(secret_guess). 네 자리수로 가정하고 풀어야 하고, 아닌 경우 0을 채워주어야 한다.

 출력 포맷은 다음과 같다. 'For secret = (_ _ _ _) and guess = (_ _ _ _), _ circles and _ squares will light up.' '_' 자리를 채워주면 된다.

 


해설

1. 함수를 만들고 싶어서 정수를 반환하는 함수로 정했다.

ans에 동그라미 개수는 십의 단위로, 사각형의 개수는 1의 단위로 정해서 반환할 것이다.

함수 내에서 s[], g[], n[11]를 선언했다. n은 각 자리 수의 개수를 저장하기 위해서 사용할 것이라 n[0]~n[9]만 사용할 것이다.

 

2. 자리수 별로 숫자들을 쪼개준다.

 s[]에 secret의 각 자리 수들을, g[]에 guess의 각 자리 수들을 저장해주었다.

 

3. 동그라미 계산

일단 같은 자리에 동일한 숫자가 있는 경우(s[i] == g[i]), ans += 10 해주고, g[i] = -1로 바꾸어 주었다.

같은 자리가 동일한 숫자가 아닌 경우(s[i] != g[i]), 사각형을 계산하기 위해서 n[s[i]]++을 해주었다.

(secret, guess)  
(1234, 1234) ans = 40, g[] = {-1,-1,-1,-1}
(4324, 1234) ans = 10(∵s[3] == g[3]), g[] = {1,2,3,-1}, n[11] = {0,0,1,1,1,0,0,0,0,0,0}

 

4. 사각형 계산

g[i]가  -1이 아닌 모든 자리의 수에 대해서(g[i] != -1), n[g[i]] > 0이면 s에 자리는 다르지만 숫자는 g[i]로 같은 경우가 존재함을 의미한다(∵n에는 동그라미가 아니었던 모든 s의 각 자리 수의 개수가 저장되어 있음).

따라서 ans++, n[g[i]--를 해서, 사각형의 개수를 한 개 증가시키고, n[g[i]]는 하나를 사용했음을 반영하여 준다.

 

5. 마지막 계산 및 출력

각 테스트케이스에 대해 함수가 return하는 ans 값들은 (10*circles + squares)와 동일하다.

printf("For secret = %d and guess = %d, %d circles and %d squares will light up.\n", secret, guess, ans/10, ans%10);

를 이용하여서 출력하여 주면 된다.

 

코드

#include<stdio.h>

int chk(int secret, int guess){
    int s[] = {secret/1000, (secret/100)%10, (secret/10)%10, secret%10};
    int g[] = {guess/1000, (guess/100)%10, (guess/10)%10, guess%10};
    int n[11] = {0,};
    int ans=0;
    for(int i = 0; i < 4; i ++){
        if(s[i] == g[i]) {
            ans+=10;
            g[i] = -1;
        }
        else n[s[i]] += 1;
    }
    for(int i = 0; i < 4; i++){
        if(g[i] != -1 && n[g[i]] > 0) {
            ans++;
            n[g[i]]--;
        }
    }
    return ans;
}

int main(){
    int N;
    scanf("%d", &N);
    while(N-->0){
        int secret, guess;
        scanf("%d %d", &secret, &guess);
        int ans = chk(secret, guess);
        printf("For secret = %d and guess = %d, %d circles and %d squares will light up.\n", secret, guess, ans/10, ans%10);
    }
    return 0;
}

'Study' 카테고리의 다른 글

[CS231n] Assignment python 정리  (0) 2023.04.05
[대회] SUAPC 2022 Winter 참여기  (0) 2022.06.06
[Linear Algebra] 01. The Geometry of Linear Equations  (0) 2022.06.06
Linear Algebra start  (0) 2022.06.06
[BOJ] #1316 그룹 단어 체커  (0) 2022.06.06