Priceless
[백준] 2503번: 숫자 야구 (C++) 본문
1부터 9까지 111~999를 범위로 하여 (0 제외) 반복문을 진행하였으며,
처음에는 111~999 를 가진 배열을 통해 후보가 아닌 숫자를 제거하여 시도 하였다
하지만 과도한 반복문 사용으로 시간 초과가 우려되었다
또한 스트라이크와 볼에 대한 접근이 어려워 다른 방법을 참고하였다
처음에는 문제 자체를 이해하기 어려웠다
맞히는 사람의 입장에서만 생각해서 하다보니 너무 어렵게 접근했는데
숫자 야구 문제를 내는 사람에서 생각하면 조금 더 쉽게 접근할 수 있는 문제였다
아래는 기존에 배열로 접근했던 코드이다
9 x 9 x 9 의 경우에서 가능하지 않은 경우를 모두 제거하려고 했다
처음 시도
int n;
cin >> n;
int arr[729]; // 가능한 모든 수
int index = 0;
for(int i = 1; i < 10; i++){
for(int j = 1; j < 10; j++){
if(i != j){
for(int k = 1; k < 10; k++){
if(j != k && i != k){
arr[index] = i * 100 + j * 10 + k;
}
else{
arr[index] = 0;
}
index++;
}
}
else{
arr[index] = 0;
index++;
}
}
}
int input;
int s, b;
for(int i = 0; i < n; i++){
cin >> input >> s >> b;
for(int j = 0; j < 729; j++){
if(arr[j] != 0){
}
}
}
다른 자료를 참고하면 전부 string을 사용한 것을 확인할 수 있다
아무래도 텍스트로 받는 것이 효율적인 듯하다
라고 생각하던 와중 숫자를 사용해서 한 자료를 찾을 수 있었다
제한 조건이 까다롭지 않아 배열로도 풀 수 있을 것 같아 계속 배열로 도전하였다
백준 2503 - 숫자 야구(C언어) (tistory.com)
백준 2503 - 숫자 야구(C언어)
2503번: 숫자 야구 첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와
blog-of-gon.tistory.com
그럼에도 계속 오류가 발생하자마자 반례를 찾아보고 돌리면서
처음 가능한 모든 수를 저장하는 숫자 729 개의 배열을 저장하면서 if 문 위치로 인해
for 문이 정상적으로 작동하지 않았다는 것을 알 수 있었다
그 부분 또한 해결하여 문제를 풀 수 있었다
해결 답안
// baekjoon 2503
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
// codes for fast I/O
void init(){
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(false);
}
int main(){
init();
int n;
cin >> n;
int arr[729]; // 가능한 모든 수
int index = 0;
for(int i = 1; i < 10; i++){
for(int j = 1; j < 10; j++){
for(int k = 1; k < 10; k++){
if(j != k && i != k && i != j){
arr[index] = i * 100 + j * 10 + k;
}
else{
arr[index] = 0;
}
index++;
}
}
}
int input;
int strike, ball;
for(int i = 0; i < n; i++){
cin >> input >> strike >> ball;
for(int j = 0; j < 729; j++){
if(arr[j] != 0){
int st = 0;
int b = 0;
int arr1 = arr[j] / 100;
int arr2 = arr[j] % 100 / 10;
int arr3 = arr[j] % 10;
int input1 = input / 100;
int input2 = input % 100 / 10;
int input3 = input % 10;
if(arr1 == input1){
st++;
}
if(arr2 == input2){
st++;
}
if(arr3 == input3){
st++;
}
if(arr1 == input2 || arr1 == input3){
b++;
}
if(arr2 == input1 || arr2 == input3){
b++;
}
if(arr3 == input1 || arr3 == input2){
b++;
}
if(!(strike == st && ball == b)){
arr[j] = 0;
}
}
}
}
int count = 0;
for(int i = 0; i < 729; i++){
if (arr[i] != 0){
count++;
}
}
cout << count;
}
'Algorithm & Test > 백준' 카테고리의 다른 글
[백준] 4796번: 캠핑 (C++) (0) | 2023.08.16 |
---|---|
[백준] 1427번: 소트인사이드 (C++) (0) | 2023.08.14 |
[백준] 1654번: 랜선 자르기 (C++) (0) | 2023.08.10 |
[백준] 2108번: 통계학 (C++) 2트 (0) | 2023.08.10 |
[백준] 2108번: 통계학 (C++) 1트 (0) | 2023.08.09 |