-
(백준 2503번 숫자야구 C++) 라이님 블로그 대회 알고리즘 따라잡기 2) 완전탐색(Brute-force Search) 3탄PROGRAMMING/알고리즘 2023. 12. 21. 22:05
푸는 속도가 너무 느려서 퇴근하고 하나씩 푸는 중이다.
밥 먹자마자 7시반부터 앉아서 풀면 보통 10시나 늦으면 11시반 쯤 한 문제를 푼다.
오늘은 7시 30분 ~ 9시 50분까지 2시간 20분 걸렸다.
(문제 어떻게 풀지 미리 읽고보고 생각해놓은건 안비밀🥲)
1탄과 2탄은 아래↓
2023.12.18 - [알고리즘] - 라이님 블로그 대회 알고리즘 따라잡기 2) 완전탐색(Brute-force Search)
2023.12.20 - [알고리즘] - (백준 10448번) 라이님 블로그 대회 알고리즘 따라잡기 2) 완전탐색(Brute-force Search) 2탄
백준 2503번 숫자야구
https://www.acmicpc.net/problem/2503
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> void CheckStrike(int * ch, const int num, const int strike, const int ball); int main() { int check[1000] = { 0 }; int cnt, num, strike, ball; int result = 0; scanf("%d", &cnt); for (int i = 0; i < cnt; i++) { scanf("%d %d %d", &num, &strike, &ball); CheckStrike(check, num, strike, ball); } for (int i = 0; i < 1000; i++) { if (check[i] == cnt) result += 1; } printf("%d",result); } void CheckStrike(int* ch, const int num, const int strike, const int ball) { int n, m, i_temp, num_temp; int strike_cnt = 0; int ball_cnt = 0; for (int i = 0; i < 1000; i++) { num_temp = num; i_temp = i; bool arr_num[10] = { false }; bool arr_i[10] = { false }; strike_cnt = 0; ball_cnt = 0; /// 1부터 9까지 서로 다른 자연수 조건을 고려하지 않아서 넣어주는 코드^^* int n1, n2, n3; n1 = i % 10; n2 = (i / 10) % 10; n3 = (i / 100) % 10; if (n1 == n2 or n2 == n3 or n3 == n1) continue; else if (n1 == 0 or n2 == 0 or n3 == 0) continue; for (int j = 0; j < 3; j++) { n = num_temp % 10; num_temp /= 10; m = i_temp % 10; i_temp /= 10; if (n == m) strike_cnt++; /// strike인 경우 else { /// strike이 아닌 경우 ball일 수 있으므로 arr에 표시 arr_num[n] = true; arr_i[m] = true; } } /// strike의 갯수가 안 맞는 경우 숫자 i는 답이 될 수 없음 if (strike_cnt != strike) continue; /// ball의 갯수가 안 맞는 경우 숫자 i는 답이 될 수 없음 for (int k = 0; k < 10; k++) if (arr_num[k] == true and arr_i[k] == true) ball_cnt++; if (ball_cnt != ball) continue; /// strike의 갯수와 ball의 갯수가 모두 맞으므로 i는 답이 될 가능성이 있음 ch[i] += 1; } }
오늘 한 실수
1. 문제를 제대로 읽지 않았다.(이걸로 30분이나 더 걸렸다.)
문제에서는 서로 다른 1부터 9까지의 숫자를 사용한다고 했지만, 나는 중복이 가능하며 0도 포함하는 경우를 가정해 문제를 풀었었다. 그래서 비효율적으로 짜게 됨...
(이것도 너무 답답해서 문제 게시판을 보다가 알게되었다.)
2. 숫자야구는 일종의 교집합 문제이다.
문제에서 주어지는 N개의 조건을 한꺼번에 만족하는 숫자를 찾는 것이다. 합집합으로 구하다가 반환값이 너무 크게 나와서 이것도 당황했었다.
3. boo형 배열과 int형 배열의 쓰임은 다르다.
bool형 배열의 경우 당연한 말이지만 true와 false, 이 두가지 값만 가질 수 있으며
int형 배열의 경우 int형 정수를 값으로 가질 수 있다.
0부터 9사이의 숫자가 들어있는지 유무를 판단할 때는 bool형이 좋지만
0부터 9까지의 숫자가 몇 번 들어갔는지를 판단할 때는 int형이 좋다.
이 당연한 점을 간과해서 이 부분에도 디버깅으로 많은 시간을 썼다.
4. 이 외에도
for loop의 변수를 i로 사용했는데, 그 내부에서 사용하는 for loop에 변수 i를 또 사용했다거나 함수 인자로 받아 수정하고 싶었던 배열을 포인터가 아닌 배열 복사로 받아 함수에서 실행하는 등 여러 자잘한 문제가 있었다.
이런 나.. 괜찮겠..지?
'PROGRAMMING > 알고리즘' 카테고리의 다른 글