일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Swift 문법
- StateObject
- useReducer
- sqoop
- 운영체제
- Swift 기능
- swift문법
- Swift 디자인패턴
- OS
- ObservableObject
- apple developer academy 후기
- 숭실대
- 애플 디벨로퍼 아카데미 21주차 회고
- Apple Developer Academy @ POSTECH
- 데이터베이스 공부
- 데이터베이스
- 애플 디벨로퍼 아카데미
- iOS 개발 오류
- ObservedObject
- global soop
- 소프트웨어분석및설계
- 치지직
- 제앱소
- 네이버 치지직
- react
- 앱 비교 프로젝트
- 애플 아카데미 후기
- 네이버 부스트캠프
- 애플 디벨로퍼 아카데미 후기
- SWIFT
- Today
- Total
사과하는 제라스
[백준 BOJ 2480번] 주사위 세개 본문
목차
출처 : https://www.acmicpc.net/problem/2480
1. 문제
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
- 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.
3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.
2. 입력
첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.
3 3 6
2 2 2
6 2 5
3. 출력
첫째 줄에 게임의 상금을 출력 한다.
1300
12000
600
4. 풀이
이 문제에서 키 포인트는 같은 숫자 개수를 찾는 것이다. 물론 3개를 for문과 if문의 혼합을 통해 구하는 것이 가능하지만 이는 주사위 개수가 적은 문제의 경우에만 사용할 수 있다. 주사위 개수가 많아짐에 따라 잦은 비교문이 요해지고 n 중 for문이 등장해야 하다보니 시간복잡도의 기하급수적 증가가 생겨나기 때문이다.
이 경우 코드가 매우 복잡해지고 길어지므로 배열에서 해당 값이 등장하는 Frequency(빈도)를 찾아낸 후 그에 따라 값을 적용하는 방법을 사용할 수 있다. 이 기능은 Collections.frequency에 정의되어 있으며 이를 잘 사용하면 목적성에 따라 값을 이용할 수 있다. 이와 관련해서는 다음 블로그를 참조하였다.
https://hianna.tistory.com/572
5. 소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int max = 0;
if(a==b && b==c) System.out.println(10000+a*1000);
else if(a==b) System.out.println(1000+a*100);
else if(a==c) System.out.println(1000+a*100);
else if(b==c) System.out.println(1000+b*100);
else{
if(a>=b){
if(a>c) max = a;
else max = c;
}
else{
if(b>c) max = b;
else max = c;
}
System.out.println(max*100);
}
}
}
6. 배운 것
어려운 문제는 아니나 for문이 들어가면 오히려 힘들어지는 문제였다. 오직 if문만을 사용하여 문제를 푸는 것이 문제의 목적성에 맞는 것 같다.
또한, 문제의 연장선으로서 주사위 개수가 많아지는 경우엔 Collections.frequency 함수를 활용해서 배열에 등장하는 값들의 중복 여부 및 중복개수를 구해낼 수 있다는 것을 배웠다.
'JAVA 백준 알고리즘 문제풀이 > 조건문' 카테고리의 다른 글
[백준 BOJ 2525번] 오븐 시계 (0) | 2022.03.24 |
---|---|
[백준 BOJ 2884번] 알람 시계 (0) | 2022.03.24 |
[백준 BOJ 14681번] 사분면 고르기 (0) | 2022.03.24 |
[백준 BOJ 2753번] 윤년 (0) | 2022.03.24 |
[백준 BOJ 9498번] 시험 성적 (0) | 2022.03.24 |