https://www.acmicpc.net/problem/2503
역시,, 완전 탐색이나 구현, 시뮬레이션은 코드가 길어진다..
어떻게 하면 좋을지 열심히 머리 굴리다가 다른 사람 코드를 보게 되었다.
아쉽게도 혼자선 풀지 못했지만 어떤 식으로 문제를 풀면 좋을지 생각할 수 있게 되었다. 다음에는 꼭 혼자 풀어봐야지..
일단, 완전탐색은 쉬우면서도 헷갈리는데 가장 중요한 것은
"머릿속에서 생략된 계산을 표현할 수 있어야 한다"는 것이다.
쉽진 않겠지만 최대한 풀어서 문제를 풀어보도록 노력해야겠다.
세 자리 수만 나올 수 있으므로 100부터 999까지 가능한데, 여기서 1~9까지 서로 다른 숫자 3개로 구성된다고 했으니
1. arr에 가능한 숫자 정보 넣기 (t/f)
0이 포함되면 안 되고, 서로 다른 숫자여야 한다. 그러므로 일단 arr 배열에 가능한 숫자는 true, 불가능한 숫자는 false로 구분해준다.
2. 민혁이 추측한 수와 arr [i]=true인 수 비교하기
여러 자리 수의 각 숫자들을 확인하려면 정수보단 문자열이 편하다. 이럴 땐 문자열로 바꿔서 for문으로 쭉 돌도록 하자. (to_string(n))
n개의 민혁이가 추측한 수를 입력받으면서 민혁이가 추측한 수(num), 스트라이크 개수(s), 볼 개수(b)를 입력받고
for문으로 123~999 중 가능한 숫자 인덱스 arr 배열을 쭉 돌면서 추측 수와의 스트라이크 개수와 볼 개수를 카운팅 한다.
for문이 끝나면 strike, ball 개수를 비교하고 다르다면 arr 배열을 false로 바꾼다.
n개의 추측 수를 모두 확인했다면 for문을 끝내고 나와 arr [i]=true인 인덱스를 찾아서 카운팅 해준다.
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
bool arr[1000];
int n, num, strike=0, ball=0, s, b;
for(int i=123; i<999; i++) arr[i] = true;
//arr에 가능한 숫자 정보 (서로다른수로 이루어진 3자리 수, 1~9 이므로 0 안됨)
for(int i=123; i<999; i++){
string s = to_string(i);
if(s[0] == s[1] || s[1] == s[2] || s[2] == s[0] || s[0] == '0' || s[1] == '0' || s[2] == '0')
arr[i] = false;
}
//입력받기
cin >> n;
for(int i=0; i<n; i++){
cin >> num >> s >> b;
string mh = to_string(num); //민혁이 추측한 수
for(int j=123; j<999; j++){
strike = 0;
ball = 0; //초기화
if(arr[j]){
string tmp = to_string(j);
for(int x=0; x<3; x++){
for(int y=0; y<3; y++){
//strike
if(x==y && mh[x] == tmp[y]) strike++;
if(x!=y && mh[x] == tmp[y]) ball++;
}
}
if(strike != s || ball != b) arr[j] = false;
}
}
}
int ans = 0;
for(int i=123; i<999; i++) if(arr[i]) ans++;
cout << ans << '\n';
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 9093번: 단어 뒤집기 (0) | 2022.07.16 |
---|---|
[백준/c++] 5568번: 카드 놓기 (0) | 2022.07.14 |
[백준/c++] 18511번: 큰 수 구성하기 (0) | 2022.07.14 |
[백준/c++] 1969번: DNA (0) | 2022.07.14 |
[백준/c++] 2422번: 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2022.07.14 |