PS/BOJ

[BOJ] 백준 2503. 숫자야구 (Silver V) + 급할수록 천천히 풀자

kth990303 2021. 10. 6. 20:45
반응형

이 문제를 포스팅하는 이유는 풀이가 기억해둘만해서가 아닌, 조심해야 할 마음가짐을 기록하기 위해서이다.

 

문제는 아래와 같다.

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

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

이 문제는 사실 아래 그룹연습 D번으로 접한 문제이다.

40분 동안 총 4문제를 해결하면 된다.

간단한 문제인데 왜 이렇게 많이 틀렸는지, 그리고 C번은 왜 이렇게 오래 걸렸는지 (C번은 브론즈2이다.) 포스팅하려 한다. 


의식의 흐름 및 해설

일단 백준 포스팅이니 간단하게 풀이를 써보자면,

어차피 총 세자리 수밖에 안되므로 수를 to_string으로 문자열로 형변환해준 후, for문으로 O(N*3*3)을 돌면 된다.

그렇게 해서 strike, ball이 입력에서 주어진 것과 일치할 수 없는 경우라면 제외시켜준다.

이렇게 완전탐색해서 해결해주면 된다.

 

그럼 왜 틀렸는가?

사실 이 연습은 문제셋을 쉬운 문제들로 세팅해놨기 때문에 빠르게 풀고 쉬자는 생각이 컸다.

그리고 실제 코딩테스트라면 이런 문제는 비록 구현량이 좀 있지만 빠르게 풀고 넘어가는 게 좋지 않을까 싶은 마음도 존재했다.

그렇게 허둥지둥댄 결과, 문제에서 놓친 두 가지 조건이 있었다.

  1. 숫자는 0~9까지가 아닌 1~9까지 가능하다.
  2. 주어지는 수의 숫자들은 모두 서로 다른 숫자로 주어진다.

2번을 파악하지 못해서 원래 문제의 난이도보다 어렵게 접근했으며,

나중에 알아채서 수정하였으나, 결국 1번을 시간이 끝날때까지 파악하지 못해 맞추지 못하고 30분 후에 AC를 받았다.

 

항상 아무리 급하더라도, 문제를 읽을 때는 차분하게 읽자.

 

마음이 급해질 때면 주기적으로 하는 실수인데, 이렇게 포스팅함으로써 최대한 실수를 줄여보도록 하자.

 

 

또한, C번이 오래 걸린 이유도 지금 생각해보면 마음이 급해서 차분하게 생각하지 못해 풀이를 늦게 떠올린 것이 한몫하는 듯하다.

 


코드

급하게 이것저것 수정하느라 다른 코드들보다 가독성이 떨어질 것이다.

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#define all(v) (v).begin(), (v).end()
#define press(v) (v).erase(unique(all(v)), (v).end())
using namespace std;
const int MAX = 1000;
int N, ans;
bool flag[MAX];
vector<int> res;
int main() {
	cin.tie(0)->sync_with_stdio(0);

	cin >> N;
	fill(flag, flag + MAX, true);
	while (N--) {
		int n, S, B;
		cin >> n >> S >> B;
		string str = to_string(n);
		for (int i = 100; i < MAX; i++) {
			if (!flag[i])
				continue;
			string tmp = to_string(i);
			int s = 0, b = 0;
			for (int j = 0; j < 3; j++) {
				for (int k = 0; k < 3; k++) {
					if (str[k] == tmp[j]) {
						if (j == k)
							s++;
						else
							b++;
					}
				}
			}
			if (s != S || b != B) {
				flag[i] = false;
			}
		}
	}
	for (int i = 100; i < MAX; i++) {
		string str = to_string(i);
		if (str[0] == '0' || str[1] == '0' || str[2] == '0')
			continue;
		if (str[0] != str[1] && str[1] != str[2] && str[2] != str[0]) {
			if (flag[i]) {
				ans++;
				res.push_back(i);
			}
		}
	}
	cout << ans << "\n";
}

 

반응형