2022. 1. 13. 18:48ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2303
접근 방법 - 브루트포스 알고리즘을 이용한 연산 문제
백준의 2303번 문제는 브루트포스 알고리즘을 이용해서 해결해야 하는 문제이다.
여기서 브루트포스 알고리즘이란, 모든 경우의 수를 감안하며 해답을 얻어내는 알고리즘을 뜻한다.
모든 경우의 수를 감안하기 때문에 그만큼 실행 속도가 느리고 코드의 가독성도 떨어진다.
하지만 문제의 알고리즘 분류에 브루트포스 알고리즘만 있는 걸 봐선 이렇게 푸는 게 맞는 것 같다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 사람의 수(n)를 입력받은 뒤 첫 번째 사람부터 순차적으로 5개의 카드 숫자를 입력받는다.
(i: 각 사람의 번호)
2) i번째 사람의 5장 카드에 있어, 세 카드의 합에 대한 모든 경우의 수를 각각 비교한다. (10가지 조건문 실행)
3개의 카드를 더한 값의 1의 자릿수가 현재까지의 최댓값(max1) 보다 클 때, max1에 해당 값을 넣는다.
3) max1의 연산이 끝나면 max와 같은지 확인한다. 같으면 max에 max1의 값을 넣고 i를 따로 저장한다(ans).
- max: 모든 사람들의 카드를 기준으로, 가장 큰 일의 자릿수를 저장하는 변수
- max1: 한 사람의 카드를 기준으로, 가장 큰 일의 자릿수를 저장하는 변수
- i: 현재 탐색하고 있는 카드들의 주인 (i번째 사람)
- ans: 현재까지의 우승자 (연산한 일의 자릿수가 전체적으로 가장 큰 카드들의 주인)
4) 모든 사람의 카드 탐색이 끝나면 최종적으로 i가 저장된 ans를 출력한 뒤, 실행 종료한다.
성공한 코드
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
//백준 2303번 코드
int a[10];
int main() {
int n, max=0, max1=0, ans=0;
int i, j;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
for (j = 1; j <= 5; j++) {
scanf("%d", &a[j]);
}
max1 = 0;
if ((a[1] + a[2] + a[3]) % 10 >= max1) {
max1 = (a[1] + a[2] + a[3]) % 10;
}
if ((a[1] + a[2] + a[4]) % 10 >= max1) {
max1 = (a[1] + a[2] + a[4]) % 10;
}
if ((a[1] + a[2] + a[5]) % 10 >= max1) {
max1 = (a[1] + a[2] + a[5]) % 10;
}
if ((a[1] + a[3] + a[4]) % 10 >= max1) {
max1 = (a[1] + a[3] + a[4]) % 10;
}
if ((a[1] + a[3] + a[5]) % 10 >= max1) {
max1 = (a[1] + a[3] + a[5]) % 10;
}
if ((a[1] + a[4] + a[5]) % 10 >= max1) {
max1 = (a[1] + a[4] + a[5]) % 10;
}
if ((a[2] + a[3] + a[4]) % 10 >= max1) {
max1 = (a[2] + a[3] + a[4]) % 10;
}
if ((a[2] + a[3] + a[5]) % 10 >= max1) {
max1 = (a[2] + a[3] + a[5]) % 10;
}
if ((a[2] + a[4] + a[5]) % 10 >= max1) {
max1 = (a[2] + a[4] + a[5]) % 10;
}
if ((a[3] + a[4] + a[5]) % 10 >= max1) {
max1 = (a[3] + a[4] + a[5]) % 10;
}
if (max1 >= max) {
max = max1;
ans = i;
}
}
printf("%d", ans);
}
제출 결과
(2021.08.27 백준 2303번 문제 제출 결과)
(나만 복잡하게 풀었는 줄 알았는데, 브루트포스 알고리즘이 이런 건 줄 몰랐지... 하면서 글 급히 수정한 건 안 비밀)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 2439번 별 찍기 - 2 (C언어) (0) | 2022.01.15 |
---|---|
[백준 BOJ] 2438번 별 찍기 - 1 (C언어) (0) | 2022.01.13 |
[백준 BOJ] 2028번 자기복제수 (C언어) (0) | 2022.01.13 |
[백준 BOJ] 1978번 소수 찾기 (C언어) (0) | 2022.01.11 |
[백준 BOJ] 1935번 후위 표기식2 (C++/cpp) (0) | 2022.01.11 |