[백준 BOJ] 2303번 숫자 게임 (C언어)

2022. 1. 13. 18:48PS (Program Solving)/BOJ (백준)

문제 설명

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

 

2303번: 숫자 게임

N명이 모여 숫자 게임을 하고자 한다. 각 사람에게는 1부터 10사이의 수가 적혀진 다섯 장의 카드가 주어진다. 그 중 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람이 게임을 이

www.acmicpc.net

백준 BOJ 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);
}

 

제출 결과

백준 BOJ 2303번 숫자 게임 문제 C 제출 결과

(2021.08.27 백준 2303번 문제 제출 결과)

(나만 복잡하게 풀었는 줄 알았는데, 브루트포스 알고리즘이 이런 건 줄 몰랐지... 하면서 글 급히 수정한 건 안 비밀)

반응형