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);
}
}
'백준 알고리즘 > 브루트 포스(완전 탐색)' 카테고리의 다른 글
[백준 알고리즘 2422] 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 자바 [브루트 포스] (2) | 2023.10.17 |
---|---|
[백준 셀프넘버 - 4673] 자바 Java [브루트 포스 알고리즘] (1) | 2023.10.06 |
[백준 1251 단어 나누기] - Java 자바 [브루트 포스] (1) | 2023.10.02 |
[백준 2003] 수들의 합 2 Java - [투 포인터 , 브루트 포스] (0) | 2023.10.01 |
[백준 1543] - 문서 검색 [자바] 실버 5 (0) | 2023.09.28 |