일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래밍
- 스프링
- 모의해킹
- 스프링부트
- SQL
- 문법
- 오라클
- 파이썬
- SQL 문법
- 해킹실습
- 데이터프로그래밍
- c언어
- 이클립스
- 문제풀이
- 토이프로젝트
- 코딩테스트
- 백준
- 자바
- 데이터베이스
- 스파크
- 필기
- 알고리즘
- 기초
- 리눅스마스터 2급 2차
- SQL 정리
- 빅데이터
- 엘라스틱서치
- MySQL
- 프로그래머스
- 위클리챌린지
- Today
- Total
개발일기
백준 2303번 JAVA 풀이 - 숫자 게임 본문
문제 링크 : https://www.acmicpc.net/problem/2303
2303번: 숫자 게임
N명이 모여 숫자 게임을 하고자 한다. 각 사람에게는 1부터 10사이의 수가 적혀진 다섯 장의 카드가 주어진다. 그 중 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람이 게임을 이
www.acmicpc.net
문제
N명이 모여 숫자 게임을 하고자 한다. 각 사람에게는 1부터 10사이의 수가 적혀진 다섯 장의 카드가 주어진다. 그 중 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람이 게임을 이기게 된다. 세 장의 카드가 (7, 8, 10)인 경우에는 합은 7+8+10 = 25가 되고 일의 자리 수는 5가 된다. 어떤 사람이 받은 카드가 (7, 5, 5, 4, 9)인 경우 (7, 4, 9)를 선택하면 합이 20이 되어 일의 자리 수는 0이 되고, (5, 5, 9)를 선택하면 합이 19가 되어 일의 자리 수는 9가 된다. 게임을 이기기 위해서는 세 장의 카드를 선택할 때 그 합의 일의 자리 수가 가장 크게 되도록 선택하여야 한다.
예를 들어, N=3일 때
- 1번 사람이 (7, 5, 5, 4, 9),
- 2번 사람이 (1, 1, 1, 1, 1),
- 3번 사람이 (2, 3, 3, 2, 10)의
카드들을 받았을 경우, 세 수의 합에서 일의 자리 수가 가장 크게 되도록 세 수를 선택하면
- 1번 사람은 (5, 5, 9)에서 9,
- 2번 사람은 (1, 1, 1)에서 3,
- 3번 사람은 (2, 3, 3)에서 8의
결과를 각각 얻을 수 있으므로 첫 번째 사람이 이 게임을 이기게 된다.
N명에게 각각 다섯 장의 카드가 주어졌을 때, 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람을 찾는 프로그램을 작성하시오. 가장 큰 수를 갖는 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람의 번호를 출력한다.
입력
첫 줄에는 사람의 수를 나타내는 정수 N이 주어진다. N은 2이상 1,000이하이다. 그 다음 N 줄에는 1번부터 N번까지 각 사람이 가진 카드가 주어지는 데, 각 줄에는 1부터 10사이의 정수가 다섯 개씩 주어진다. 각 정수 사이에는 한 개의 빈칸이 있다.
출력
게임에서 이긴 사람의 번호를 첫 번째 줄에 출력한다. 이긴 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람의 번호를 출력한다.
# 문제 풀이
한명이 가질 수 있는 카드의 수는 5개로 고정 되어있기 때문에 3중 반복문을 사용해도 실행 시간이 오버되지 않는다.
1. initArr
테스트 케이스의 수를 입력받은 후 2차원 배열을 만들고 사용자가 뽑은 5개의 카드를 입력받는다.
n = sc.nextInt();
arr = new int[n][5];
for(int i = 0; i < n; i++){
for(int j = 0; j < 5; j++){
arr[i][j] = sc.nextInt();
}
}
2. findMax 함수
findMax 함수를 통해 각 사용자가 뽑을 수 있는 최대 값을 뽑은 후 max 배열에다 담는다.
후에 answer 값과 비교 후 계산한 값이 더 크다면 idx와 answer를 최대값으로 변경한다.
for(int i = 0; i < n; i++){
max[i] = findMax(i);
if(answer <= max[i]){
answer = max[i];
idx = i;
}
}
3. findMax
static int findMax(int index){
int max = 0;
for(int i = 0; i < 3; i++){
for(int j = i + 1; j < 4; j++){
for(int k = j + 1; k < 5; k++){
if((arr[index][i]+arr[index][j]+arr[index][k]) % 10 > max) max = (arr[index][i]+arr[index][j]+arr[index][k]) % 10;
}
}
}
return max;
}
# 코드 전체
import java.util.*;
public class Main_2303{
static int[][] arr;
static int n;
static int[] max;
public static void main(String[] args){
initArr();
max = new int[n];
int answer = 0;
int idx = 1;
for(int i = 0; i < n; i++){
max[i] = findMax(i);
if(answer <= max[i]){
answer = max[i];
idx = i;
}
}
System.out.println(idx + 1);
}
static void initArr(){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
arr = new int[n][5];
for(int i = 0; i < n; i++){
for(int j = 0; j < 5; j++){
arr[i][j] = sc.nextInt();
}
}
}
static int findMax(int index){
int max = 0;
for(int i = 0; i < 3; i++){
for(int j = i + 1; j < 4; j++){
for(int k = j + 1; k < 5; k++){
if((arr[index][i]+arr[index][j]+arr[index][k]) % 10 > max) max = (arr[index][i]+arr[index][j]+arr[index][k]) % 10;
}
}
}
return max;
}
}
/*
3
7 5 5 4 9
1 1 1 1 1
2 3 3 2 10
*/
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준 1063번 JAVA 풀이 - 킹 (0) | 2022.07.15 |
---|---|
백준 1026번 JAVA 풀이 - 보물 (2) | 2022.07.12 |
백준 1431번 JAVA 풀이 - 시리얼 번호 (0) | 2022.07.07 |
백준 1302번 JAVA 풀이 - 베스트셀러 (0) | 2022.07.06 |
백준 2149번 JAVA 풀이 - 암호 해독 (0) | 2022.07.04 |