일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- BOJ
- 백준
- Linear algebra
- 백준알고리즘
- 맥실리콘
- arm칩에안드로이드
- BAEKJOON
- CS231nAssignment1
- 맥북원스토어
- Algorithm
- ㅐㅕ세ㅕㅅ
- CS231ntwolayerneuralnet
- CS231nSVM
- RegionProposalNetworks
- Gilbert Strang
- adversarialattackonmonoculardepthestimation
- MacOS
- professor strang
- CNNarchitecture
- 선형대수학
- ios원스토어
- CNN구조정리
- 아이폰원스토어
- pycharmerror
- gpumemory
- 선대
- CS231nAssignments
- CS231n
- monoculardepthestimation
- MIT
- Today
- Total
개발로 하는 개발
[BOJ] #6997 Guessing Game I 본문
문제
https://www.acmicpc.net/problem/6997
숫자 야구와 동일한 시스템이다. 상대가 모르는 우리만 아는 숫자가 'secret', 그리고 상대가 'secret'과 관련된 정보를 얻기 위해 불러주는 숫자가 'guess'. 'secret'과 'guess'를 알려주었을 때 같은 자리에 동일한 숫자가 있으면 동그라미 하나, 다른 자리이지만 동일한 숫자가 있으면 사각형 하나. 이렇게 총 개수를 형식에 맞게 출력해주면 된다.
입력으로는 첫 줄에 테스트 케이스 개수를 알려주고 그 뒤로 각 테스트 케이스에서 정수형태의 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 |