패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기

자바로 퀴즈 풀기 - 패스트캠퍼스 백엔드 부트캠프 3기

Tech_JINI 2024. 12. 23. 18:38

 

첫 번째 퀴즈 

야구 게임이다. 3개의 숫자 (1~9를 중복 없이) 중에서 두 개를 비교하여 결과를 "1S2B"와 같은 형식으로 출력하라. 

Strike : 값과 위치가 동일해야 한다.

ball : 값은 같고 위치가 달라야 한다.

 

야구 룰을 몰라 문제를 이해하는데 많은 시간이 들었다..

결국 챗지피티에게 이 문제의 의미를 물어보았고, 그제서야 룰을 이해했다.

 

더보기

1. 게임 기본 규칙:

  • 두 개의 숫자 세트를 비교합니다. 각 숫자 세트는 1부터 9까지의 중복 없는 3자리 숫자로 이루어져 있습니다.
    • 예: 123과 231
  • 두 숫자 세트의 숫자와 위치를 비교하여 결과를 스트라이크(s)와 볼(b)로 표현합니다.

2. 스트라이크 (s):

  • 두 숫자 세트에서 숫자와 위치가 모두 같으면 스트라이크입니다.
    • 예:
      • 숫자 세트: 123 (첫 번째 세트), 153 (두 번째 세트)
      • 결과: 1 스트라이크 (1번 자리에 있는 숫자 1이 동일함).

3. 볼 (b):

  • 두 숫자 세트에서 숫자는 같지만 위치가 다르면 볼입니다.
    • 예:
      • 숫자 세트: 123 (첫 번째 세트), 231 (두 번째 세트)
      • 결과: 2 볼 (숫자 2와 3이 포함되어 있지만 위치가 다름).

4. 예시 결과:

  • 첫 번째 세트: 123
  • 두 번째 세트: 132

비교:

  • 숫자 1: 같은 위치에 있음 → 1 스트라이크
  • 숫자 2: 다른 위치에 있음 → 1 볼
  • 숫자 3: 다른 위치에 있음 → 1 볼

결과: 1s2b.

그렇다고 한다..

 

 

나의 코드

import java.util.*;

public class Quiz2 {

	public static void main(String[] args) {

		ArrayList<Integer> baseball_1 = new ArrayList<>();
		ArrayList<Integer> baseball_2 = new ArrayList<>();
		int s = 0;
		int b = 0;
	
		// 
		Random add_ran = new Random();
		
		
		int i =0;
		while(i<3) {
			i++;
			int ran_dom = add_ran.nextInt(10) +1;
			baseball_1.add(ran_dom);
		}
		
		int a =0;
		while(a<3) {
			a++;
			int ran_dom = add_ran.nextInt(10) +1;
			baseball_2.add(ran_dom);
		}
		
	
		
		
		for(int j=0;j<3;j++) {
			for(int t=0;t<3;t++) {
				if(baseball_1.get(j) == baseball_2.get(t)) {
					if(j==t) {
						s++; 
					} else {
						b++; 
					}
				}
				
				
			}
			
			
		}
		System.out.println(baseball_1);
		System.out.println(baseball_2);
		
		System.out.println("스트라이크: "+s+", 볼: "+b);
		
	}

}

코드가 잘 돌아가는 모습 _ 콘솔 창

정수가 들어갈 리스트를 2개 만들어 각각 랜덤한 숫자 3개를 담게 했다.

2중 for 문으로 두 개의 리스트 중에 같은 값이 있는지 1차적으로 검사 -> 있다면 위치를 판별하게 하여 ball과 strike를 분류했다.

 

 

이때, 코드를 계속 런해보니 문제점을 발견했다!

[4,2,5] [4,4,7]과 같이 나온 경우에 결과가 스트라이크1, 볼0으로 나와야 하는데, 내 코드는 스트라이크1 볼1로 나오는 것이다.

 

이 문제는 스트라이크로 분류되었을 때 다시 for문으로 돌아가 다른 숫자로 넘어가야 했었는데, 내 코드는 else문까지 거쳐져서 생기는 문제였다. 

 

 

코드 문제 해결

해결 방법은 의외로 간단했다. if-else문에 break를 추가하는 것. 

 

 

문제점을 해결한 모습 _ 콘솔창

 

 

두 번째 퀴즈

배열 arr( int[] arr = {2, 5, 2, 3, 3, 3, 1, 1, 1, 1})에서 

1. 중복 제거해서 출력하기 => 1 2 3 5

2. 정렬해서 출력하기 => 1 1 1 1 2 2 2 3 3 3 5

 

나의 코드 - 중복 제거

import java.util.*;

public class Quiz1 {

	public static void main(String[] args) {

		int[] arr = {2, 5, 2, 3, 3, 3, 1, 1, 1};
		int[] answer = new int[10];

		// 1. 중복제거한 값 출력
		
		for(int t=0; t<arr.length; t++) {
			answer[arr[t]]++;
		} // 0 3 2 3 0 1
		for(int i=0; i <arr.length; i++) {
			if(answer[i]>=1) {
				System.out.print(i+" ");
			} 
		}
				
		
	}
	
}

기존에 있던 arr배열에 있는 값을 읽어 카운팅하여 answer 배열에 카운팅한 값을 넣었다.

-> 0[인덱스값]은 없음[인덱스의 요소값], 1은 3개, 2는 2개 등등 읽어, answer = {0, 3, 2 , ...}식으로 채우는 것이다.

따라서, 인덱스에 들어있는 값이 1개 이상이면 인덱스값을 출력하게 하여 중복을 제거하고 값을 출력하게 만들었다.

 

나의 코드 - 정렬해서 출력하기

import java.lang.annotation.Repeatable;
import java.util.*;

public class Quiz1 {

	public static void main(String[] args) {

		int[] arr = {2, 5, 2, 3, 3, 3, 1, 1, 1};
		int[] answer = new int[10];
		

		// 1. 중복제거한 값 출력
		
		for(int t=0; t<arr.length; t++) {
			answer[arr[t]]++;
		} // 0 3 2 3 0 1
		for(int i=0; i <arr.length; i++) {
			if(answer[i]>=1) {
				System.out.print(i+" ");
			} 
		}
				
		// for(int j=0; j<arr.length; j++) {

			// System.out.print(j)*answer.repeat[j]); >> 수정하기

		// }
			// 정렬해서 출력
			// 0번과 1번 비교 -> 작은 것 앞으로
			// 2번과 1



			//System.out.print(i.repeat[i]);
	}
	
}

아직 해결책을 내놓지 못했다.

나의 아이디어는 이렇다. 앞에서 카운팅한 것들을 담은 answer배열을 이용하는 방법이다. 

 

인덱스 값을 출력시키는데 그것을 인덱스의 요소값만큼 출력시키는 것을 생각해 보았다!

 

따라서 요소의 값이 0이면 출력되지 않게 하고 (인덱스 4의 요소값은 0이므로 출력하지 않게),

요소값이 1 이상이면 값이 요소값만큼 출력될 것이다.( 인덱스 1의 요소값은 4이므로, 1을 4번 출력시킬 것이다.)

 

문자열을 반복시키려면 repeat를 사용하는 방법이 있다고 한다.

그렇지만 어째서인지 코드가 잘 안 풀려 아직 완성하지 못했다.. 

 

------------------> 해결 ! 

해결 코드 

import java.util.*;

public class Quiz1 {

	public static void main(String[] args) {

		int[] arr = {2, 5, 2, 3, 3, 3, 1, 1, 1};
		int[] answer = new int[10];
	

		// 1. 중복제거한 값 출력

		for(int t=0; t<arr.length; t++) {
			answer[arr[t]]++;
		} // 0 3 2 3 0 1
		for(int i=0; i <arr.length; i++) {
			if(answer[i]>=1) {
				System.out.print(i+" ");
			} 
		}

		System.out.println();

		// 111 22 333 5
		int index = 0;
		for (int count : answer) { //배열의 각 요소에 대해 반복 // 0 3 2 3 0 1

			if (count>0) {
				for(int j=0; j<count; j++)
					System.out.print(index);
			}
			
			index++;

		}

	}
}

 

 

앞에서 카운팅한 것들을 담은 answer배열을 이용하였다. 

가장 풀리지 않았던 문제는 인덱스 값을 출력시키는 것이었다.

그 전에는 인덱스 값을 나타낼 수 있는 메소드를 찾아 헤매느라 시간을 썼다. 하지만 아예 index 변수를 생성하여 문제를 해결했다. 

 

for-each를 사용하여 리스트의 요소들(0 3 2 3 0 1)을 순회시키고,

요소가 0보다 클 때, for문을 사용하여 요소값만큼 인덱스 값이 출력시키게 만들었다. 

 

항상 문제가 잘 안 풀릴 때, 내가 몰랐던 메소드를 찾으려는 습관이 있다.

하지만, 내가 기존에 알고 있던 상식을 이용해 푸는 것이 곧 답이 될 수 있다는 점을 명심해야 함을 느꼈다.