띠오니 개발자 성장일지
article thumbnail
반응형

 

인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.

C, C++, Python, Js 등 다른 언어의 강의도 있으니 본인에게 맞는 강의를 선택하시면 됩니다. 😁

https://inf.run/pCPH

 

자바(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번 결과가 된다.

 


 

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!