2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[백준 알고리즘 - 숫자게임 2303] 자바 -브루트 포스 [실버 4]

2023. 10. 6. 01:25ㆍ백준 알고리즘/브루트 포스(완전 탐색)

2303번: 숫자 게임 (acmicpc.net)

 

2303번: 숫자 게임

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

www.acmicpc.net

 

 

 

 

 

 

[작성자가 실수한 점?]

 

이긴 사람이 두 명 이상일 경우에 번호가 가장 큰 사람의 번호를 출력한다를 잘 이해못해서

총 카드 5장 중에 더해서 가장 큰 사람의 번호를 출력한다는 뜻인지 알았다..

그 외에는 막힘없이 하였다.

 

 

[해설 및 풀이]

 

이 문제는 블랙잭 문제와 비슷한데 조금 더 응용된 문제 입니다.

 

일단 총 5개의 카드 중 3장의 카드 중 끝 값이 가장 큰 사람이 승리한다는 게임 입니다.

 

그리고 만약 끝 값이 같다면 번호가 가장 큰 사람을 출력합니다.

 

즉 1번 유저 끝 값 6

    2번 유저 끝 값 6

    3번 유저 끝 값 3

이라고 한다면 2번 유저가 끝 값이 6임으로

 

2번 유저를 출력하라는 뜻이 됩니다. (이거 때문에 30분 넘게 날림)

 

 

그렇다면 이 문제는 이렇게 이해하면 됩니다.

 

2개의 모든 값들을 찾아야 한다  = 2중 포문

 

3개의 모든 값들을 찾아야 한다 = 3중 포문

이렇게 외워두시면 편합니다.

 

이 문제의 경우 3개의 카드 중 모든 경우의 수를 찾아서

끝 값이 가장 큰 것을 찾아야 하기 때문에

 

3중 포문형식으로 돌려야 합니다.

 

 

이 문제의 경우 두 가지 방법이 있습니다.

 

1.Math.max()함수를 사용해 끝 값이 가장 큰 값을 찾음.

 

2.List를 사용해 모든 경우의 수를 찾은 후 중복 제거 후 , 내림차순으로 값들을 찾는다음

가장 내림차순이 높은 값들을 찾는다.

 

 

1번의 경우

 

 

package com.algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class Main{

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        List<Integer> list = new ArrayList<>();

        int value = Integer.parseInt(st.nextToken());

        int[] array = new int[5]; // 카드 5장을 담을 배열

        for(int i=0; i<value;i++){

            st = new StringTokenizer(br.readLine());

            for(int j=0; j<array.length;j++){

                array[j] = Integer.parseInt(st.nextToken()); // 카드 5장을 배열에 담음
            }
            int Max = 0;

            for(int a=0; a<array.length;a++){ // 3중 포문으로 3개의 카드의 경우의수를 찾는다.

                for(int b = a+1; b<array.length;b++){

                    for(int c=b+1; c<array.length;c++){

                        int sum = (array[a]+array[b]+array[c])%10; // 모든 카드 + 끝 자리 %10

                        Max = Math.max(Max,sum); // Math함수를 이용해 가장 큰 값을 찾는다.
                    }
                }
            }
            list.add(Max); // 값 저장
        }
        int count = 0;
        int temp = 0;
        
        for(int i=0; i<value;i++){

            if(temp <= list.get(i)){ //최대값을 찾는다.
                count = i + 1; // 가장 큰 유저인 경우 +1 이거나 값이 같을 경우 가장 큰 유저를 구하라 했음으로 <=
                
                temp = list.get(i);
            }
        }
        System.out.println(count);
    }
}

 

 

 

 

 

2번 list의 경우

 

package com.algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class Main{

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        List<Integer> list = new ArrayList<>();

        int value = Integer.parseInt(st.nextToken());

        int[] array = new int[5]; // 카드 5장을 담을 배열

        for(int i=0; i<value;i++){
            List<Integer> list1 = new ArrayList<>();

            st = new StringTokenizer(br.readLine());

            for(int j=0; j<array.length;j++){

                array[j] = Integer.parseInt(st.nextToken()); // 카드 5장을 배열에 담음
            }

            for(int a=0; a<array.length;a++){ // 3중 포문으로 3개의 카드의 경우의수를 찾는다.

                for(int b = a+1; b<array.length;b++){

                    for(int c=b+1; c<array.length;c++){

                        int sum = (array[a]+array[b]+array[c])%10; // 모든 카드 + 끝 자리 %10
                    
                        list1.add(sum); // 모든 경우의 수 넣기
                    }
                }
            }
            Collections.sort(list1,Collections.reverseOrder());//내림 차순으로 값들 정렬

          list.add(list1.get(0)); // 내림차순 중 가장 큰 값 출력

        }
        int count = 0;
        int temp = 0;

        for(int i=0; i<value;i++){

            if(temp <= list.get(i)){ //최대값을 찾는다.
                count = i + 1; // 가장 큰 유저인 경우 +1 이거나 값이 같을 경우 가장 큰 유저를 구하라 했음으로 <=

                temp = list.get(i);
            }
        }
        System.out.println(count);
    }
}