일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Winston
- 환경변수
- unnest
- 네비게이션 한번에
- 패스파라미터
- JSON Web Token
- N+1
- 메뉴바 한번에
- 3계층구조
- 알림생성
- 게시글 이미지 업로드
- JWT 쓰는이유
- 토큰
- 포트번호
- element.style
- 게시글 이미지
- .env
- 레포지토리
- secret코드
- JWT 쓰는 방법
- getComputedStyle
- JWT
- 이미지가 포함된 게시글
- 스테이지어스
- 메뉴바
- 쿼리스트링
- N+1문제
- route 53
- 알림생성모듈
- 부트캠프
- Today
- Total
기주
[코테] java - 2-3 가위바위보 본문
문제: 가위바위보
A, B 두 사람이 가위바위보 게임을 합니다. 총 N번의 게임을 하여 A가 이기면 A를 출력하고, B가 이기면 B를 출력합니다. 비길 경우에는 D를 출력합니다.
가위, 바위, 보의 정보는 1:가위, 2:바위, 3:보로 정하겠습니다.
예를 들어 N=5이면

두 사람의 각 회의 가위, 바위, 보 정보가 주어지면 각 회를 누가 이겼는지 출력하는 프로그램을 작성하세요.
입력
첫 번째 줄에 게임 횟수인 자연수 N(1<=N<=100)이 주어집니다.
두 번째 줄에는 A가 낸 가위, 바위, 보 정보가 N개 주어집니다.
세 번째 줄에는 B가 낸 가위, 바위, 보 정보가 N개 주어집니다.
출력
각 줄에 각 회의 승자를 출력합니다. 비겼을 경우는 D를 출력합니다.
예시 입력 1
5
2 3 3 1 3
1 1 2 2 3
예시 출력 1
A
B
A
B
D
풀이
기존의 풀이)
기존의 풀이에서는 분기처리를 효율적으로 하는 방법을 고려하지않고 풀었다.
풀이자체는 어렵지 않으나 분기처리가 총 6개로 이루어졌기때문에 코드를 읽고 이해하기가 어려웠다.
Scanner sc = new Scanner(System.in);
int num = Integer.parseInt(sc.nextLine());
int[] arrA = new int[num];
int[] arrB = new int[num];
for(int i=0; i<num; i++){
arrA[i] = sc.nextInt();
}
for(int i=0; i<num; i++){
arrB[i] = sc.nextInt();
}
for(int i=0; i<num; i++){
if(arrA[i] == arrB[i]){
System.out.println("D");
} else if( arrA[i] == 1 ){
if (arrB[i] == 3) {
System.out.println("A");
} else{
System.out.println("B");
}
} else if (arrA[i] == 2){
if (arrB[i] == 1) {
System.out.println("A");
} else{
System.out.println("B");
}
} else if(arrA[i] == 3){
if (arrB[i] == 2) {
System.out.println("A");
} else{
System.out.println("B");
}
개선된 풀이)
각각의 경우의 수는 모두 <A가 이기는 경우, B가 이기는 경우, 무승부>로 총 3가지이다.
이를 A의 관점에서 볼 때 <A가 이기는경우, A가 지는 경우, A 무승부> 3가지로 생각할 수 있다. 이렇게 생각하면 총 3개의 분기처리로도 간단하게 풀 수 있다. 더 간단하고 좋은 코드가 된다.
Scanner sc = new Scanner(System.in);
int num = Integer.parseInt(sc.nextLine());
int[] arrA = new int[num];
int[] arrB = new int[num];
for(int i=0; i<num; i++){
arrA[i] = sc.nextInt();
}
for(int i=0; i<num; i++){
arrB[i] = sc.nextInt();
}
for(int i=0; i<num; i++){
if(arrA[i] == arrB[i]) System.out.println("D");
else if((arrA[i]==1 && arrB[i]==3) || (arrA[i] == 2 && arrB[i] == 1) || (arrA[i]==3 && arrB[i]==2 )) System.out.println("A");
else System.out.println("B");
}
결론
모든 경우의수를 최소한의 경우의 수로 나눠 생각해보자. 그럼 최소한의 분기처리로 더 심플한 코드를 작성할 수 있다.
'알고리즘 > 코테' 카테고리의 다른 글
[코테] java - 중복원소구하기 (0) | 2024.11.04 |
---|---|
[코테] java 2-4 피보나치 수열 (0) | 2024.11.02 |
[코테] 문제 12.암호 (0) | 2024.11.01 |
[코테] java - ArrayList 메서드 정리 (0) | 2024.10.30 |
[코테] java배열 메서드 정리 (0) | 2024.10.30 |