-
(백준 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)
라이님 블로그 대회 알고리즘 따라잡기 2) 완전탐색(Brute-force Search)
개념이 매우 간단한 완전탐색! Brute-force Search라고 하는게 더 멋있는거 같은 느낌의 탐색 방법이다. 시간복잡도 때문에 자주 쓰이지는 않지만 기본 알고리즘에 속하기 때문에 꼭 알고가야 하는
jjo-mathstory.tistory.com
2023.12.20 - [알고리즘] - (백준 10448번) 라이님 블로그 대회 알고리즘 따라잡기 2) 완전탐색(Brute-force Search) 2탄
(백준 10448번) 라이님 블로그 대회 알고리즘 따라잡기 2) 완전탐색(Brute-force Search) 2탄
차근차근 라이님 블로그에 있는 완전탐색 문제를 뽀개보기로 했다. 완전 탐색 1탄은 아래로! 2023.12.18 - [알고리즘] - 라이님 블로그 대회 알고리즘 따라잡기 2) 완전탐색(Brute-force Search) 라이님 블
jjo-mathstory.tistory.com
백준 2503번 숫자야구
https://www.acmicpc.net/problem/2503
2503번: 숫자 야구
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트
www.acmicpc.net
#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; } }
ㅋㅋㅋㅋㅋ문제조건을 잘못 읽었다는걸 인지하는데 30분 걸림 ㅎ 오늘 한 실수
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 > 알고리즘' 카테고리의 다른 글