BOJ 2503 : 숫자 야구 - C++
숫자야구
- 정답을 참조한 문제 --> 핵심 로직을 파악하지 못함
코드
#include <iostream>
using namespace std;
bool arr[1002];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T,S,B,N,ans=0;
cin >> T;
fill(arr, arr+1002, true);
for(int i=123;i<=999;i++)
{
string tmp = to_string(i);
if(tmp[0]=='0' || tmp[1]=='0' || tmp[2]=='0')
arr[i] = false;
if(tmp[0]==tmp[1] || tmp[0]==tmp[2] || tmp[1]==tmp[2])
arr[i] = false;
}
while(T--)
{
cin >> N >> S >> B;
for(int i=123;i<=999;i++)
{
int s_cnt=0, b_cnt=0;
string fix = to_string(i);
string str = to_string(N);
if(!arr[i]) continue;
for(int a=0;a<3;a++)
{
for(int b=0;b<3;b++)
{
if(fix[a] == str[b] && a == b) s_cnt++;
else if(fix[a] == str[b] && a != b) b_cnt++;
}
}
if(s_cnt != S or b_cnt != B) arr[i] = false;
}
}
for(int i=123;i<=999;i++)
if(arr[i]) ans++;
cout << ans;
return 0;
}
- 로직
1) arr[123] ~ arr[999]
까지 모두 true로 초기화
2) arr[123] ~ arr[999]
중 최초 조건에 맞지 않는 숫자는 false
처리
(조건 : 1. 각 자리 중 하나라도 0인 것
2.각 자리수 중 하나라도 중복이 되는 것)
3) 입력된 숫자,strike,ball
에 대해 123 ~ 999
모두 검사하며 strike 개수와, ball 개수가 일치하지 않으면 false처리
4) arr[]
값이 true
인 것은 가능성 있는 것이니까 count!
- 핵심
: 전체 가능한 경우
에서 주어진 입력
으로 하나씩 하나씩 제거
하는 것이 핵심
(남는 것
= 받은 모든 입력에도 불구하고 정답 일 가능성이 있는 녀석
)
Author And Source
이 문제에 관하여(BOJ 2503 : 숫자 야구 - C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@neity16/BOJ-2503-숫자-야구-C
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
- 정답을 참조한 문제 --> 핵심 로직을 파악하지 못함
#include <iostream> using namespace std; bool arr[1002]; int main(){ ios::sync_with_stdio(0); cin.tie(0); int T,S,B,N,ans=0; cin >> T; fill(arr, arr+1002, true); for(int i=123;i<=999;i++) { string tmp = to_string(i); if(tmp[0]=='0' || tmp[1]=='0' || tmp[2]=='0') arr[i] = false; if(tmp[0]==tmp[1] || tmp[0]==tmp[2] || tmp[1]==tmp[2]) arr[i] = false; } while(T--) { cin >> N >> S >> B; for(int i=123;i<=999;i++) { int s_cnt=0, b_cnt=0; string fix = to_string(i); string str = to_string(N); if(!arr[i]) continue; for(int a=0;a<3;a++) { for(int b=0;b<3;b++) { if(fix[a] == str[b] && a == b) s_cnt++; else if(fix[a] == str[b] && a != b) b_cnt++; } } if(s_cnt != S or b_cnt != B) arr[i] = false; } } for(int i=123;i<=999;i++) if(arr[i]) ans++; cout << ans; return 0; }
- 로직
1)arr[123] ~ arr[999]
까지 모두 true로 초기화
2)arr[123] ~ arr[999]
중 최초 조건에 맞지 않는 숫자는false
처리
(조건 : 1. 각 자리 중 하나라도 0인 것
2.각 자리수 중 하나라도 중복이 되는 것)
3) 입력된숫자,strike,ball
에 대해123 ~ 999
모두 검사하며 strike 개수와, ball 개수가 일치하지 않으면 false처리
4)arr[]
값이true
인 것은 가능성 있는 것이니까count!
- 핵심
:전체 가능한 경우
에서주어진 입력
으로하나씩 하나씩 제거
하는 것이 핵심
(남는 것
= 받은 모든 입력에도 불구하고정답 일 가능성이 있는 녀석
)
Author And Source
이 문제에 관하여(BOJ 2503 : 숫자 야구 - C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@neity16/BOJ-2503-숫자-야구-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)