인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.
C, C++, Python, Js 등 다른 언어의 강의도 있으니 본인에게 맞는 강의를 선택하시면 됩니다. 😁
자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의
자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성
www.inflearn.com
Q2-03. 가위바위보
A, B 두 사람이 가위바위보 게임을 한다. 총 N번의 게임을 해 A가 이기면 A를, B가 이기면 B를 출력한다.
비길 경우에는 D를 출력한다.
가위 : 1, 바위 : 2, 보 : 3 으로 정한다.
N번의 게임 중 각각 누가 이겼는지 출력하는 프로그램을 만들어라.
첫번 째 줄에는 게임 횟수 정수 N을,
두번 째 줄에는 A가 낸 가위 바위 보 정보 N개,
세번 째 줄에는 B가 낸 가위 바위 보 정보 N개를 입력받는다.
예시 입력 | 예시 출력 |
5 2 3 3 1 3 1 1 2 2 3 |
A B A B D |
✏️ 내가 쓴 답
정답은 문자 배열 char[] 형태로 반환한다.
N회 게임 중 A와 B가 낸 가위바위보 정보를 2행 N열의 2차원 배열로 입력받는다.
그래서, 0행과 1행의 같은 열의 값을 비교해 승자를 가린다.
0열 (1번째 게임) | 1열 (2번째 게임) | 2열 (3번째 게임) | 3열 (4번째 게임) | 4열(5번째 게임) | |
0행 (Player A) | 2 | 3 | 3 | 1 | 3 |
1행 (Player B) | 1 | 1 | 2 | 2 | 3 |
그럼 가위바위보 비교는 어떻게 할 수 있을까?
우선 가위:1, 바위:2, 보:3 으로
한명이 ✌️(1)나 ✊(2)를 내면, 그 보다 더 큰 숫자인 ✊(2)나 🖐(3)를 낸 사람이 이긴다. 즉 ✌️(1) < ✊(2), ✊(2) < 🖐(3)
✌️(1)와 🖐(3)의 해당 방식을 따르기에, 누가 냈느냐에 따라 애매해지기 때문에 따로 케이스를 만들어준다.
내가 생각한 코드를 슈도코드로 써보면 이렇다.
if (A가 낸거 == B가 낸거) -> 결과는 D 무승부
else if (A가 가위 && B가 보자기) -> 결과는 A승리
else if (A가 보자기 && B가 가위) -> 결과는 B승리
else {
if ( A 가 낸거 > B가 낸거) -> 결과는 A 승리
else -> B 승리
}
결과 코드는 아래와 같다. 결과는 정답! ✅
import java.util.Scanner;
public class Main {
public char[] solution(int cnt, int[][] arr) {
char[] answer = new char[cnt];
for(int i=0; i<cnt; i++){
if(arr[0][i] == arr[1][i]) answer[i] = 'D';
else if(arr[0][i]==1 && arr[1][i]==3) answer[i] = 'A';
else if(arr[0][i]==3 && arr[1][i]==1) answer[i] = 'B';
else {
if(arr[0][i] > arr[1][i]) answer[i] = 'A';
else answer[i] = 'B';
}
}
return answer;
}
public static void main(String[] args) {
Main main = new Main();
Scanner sc = new Scanner(System.in);
int cnt = sc.nextInt();
int[][] arr = new int[2][cnt];
for(int i=0; i<2; i++){
for(int k=0; k<cnt; k++){
arr[i][k] = sc.nextInt();
}
}
for(char x : main.solution(cnt, arr)){
System.out.println(x);
}
}
}
😥 애매한 점
뭔가 너무 애매하게 짠 것 같다는 생각이...
D를 제외한 결과값은 어쨌든 A가 승리, B가 승리 이 두가지인데
케이스 구분을 어렵게 해서 코드 중복이 일어난 것 같다.
👨🏻🏫 풀이코드
강의를 참고하여 아래와 같이 수정했다.
선생님은 2차원 배열 대신 1차원 배열 2개로 입력을 받았고, solution() 메소드는 String으로 반환했다. (이건 나처럼 하던지, 선생님 처럼 풀던지 상관 없다! )
solution() 코드를 보자.
간단하게 가위바위보를 A가 이기는 경우를 나열하고, 그 외의 경우는 모두 B가 이기는 경우로 작성했다.
이게 훨씬 깔끔하고 이해하기 쉬운 코드인 것 같다.
import java.util.*;
class Main {
public String solution(int n, int[] a, int[] b){
String answer="";
for(int i=0; i<n; i++){
if(a[i]==b[i]) answer+="D";
else if(a[i]==1 && b[i]==3) answer+="A";
else if(a[i]==2 && b[i]==1) answer+="A";
else if(a[i]==3 && b[i]==2) answer+="A";
else answer+="B";
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
int[] a=new int[n];
int[] b=new int[n];
for(int i=0; i<n; i++){
a[i]=kb.nextInt();
}
for(int i=0; i<n; i++){
b[i]=kb.nextInt();
}
for(char x : T.solution(n, a, b).toCharArray()) System.out.println(x);
}
}
💪 보완할 점
내 코드가 정답이긴 했지만, 왜 어렵게(?) 느껴졌느냐 생각해봤는데
나는 문제를 보면 자꾸 패턴을 만들어서 풀려고 해서 그런 것 같다.
가위바위보를 이기는 경우는 몇가지 안되어서 간단하게 풀 수 있는건데, A값이 큰지 B값이 큰지 비교를 해서
시간이 걸렸던 것 같다. 뭐.. 나처럼 푸는 문제도 있겠지!
🤓 정리
- 결과가 두 가지로 나올 수 있다면, 우선 1번 결과가 나오는 케이스들을 전부 나열하자. 그 외의 케이스들은 2번 결과가 된다.
'Study > 알고리즘' 카테고리의 다른 글
[알고리즘/인프런] Array(1, 2차원 배열) #2-04. 피보나치수열 (0) | 2022.05.08 |
---|---|
[알고리즘/인프런] Array(1, 2차원 배열) #2-02. 보이는 학생 (0) | 2022.05.08 |
[알고리즘/인프런] Array(1, 2차원 배열) #2-01. 큰 수 출력하기 (0) | 2022.05.08 |
[알고리즘/인프런] String(문자열) #1-12. 암호 찾기 (0) | 2022.05.02 |
[알고리즘/인프런] String(문자열) #1-11. 문자열 압축 (0) | 2022.05.02 |