본문 바로가기
Algorithm/Programmers

숫자 야구

by 동그란 혜주 2019. 6. 4.

· 문제 설명

숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다. 각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.
* 숫자는 맞지만, 위치가 틀렸을 때는 볼
* 숫자와 위치가 모두 맞을 때는 스트라이크
* 숫자와 위치가 모두 틀렸을 때는 아웃
예를 들어, 아래의 경우가 있으면
A : 123
B : 1스트라이크 1볼.
A : 356
B : 1스트라이크 0볼.
A : 327
B : 2스트라이크 0볼.
A : 489
B : 0스트라이크 1볼.
이때 가능한 답은 324와 328 두 가지입니다.
질문한 세 자리의 수, 스트라이크의 수, 볼의 수를 담은 2차원 배열 baseball이 매개변수로 주어질 때, 가능한 답의 개수를 return 하도록 solution 함수를 작성해주세요.

 

· 제한 사항

질문의 수는 1 이상 100 이하의 자연수입니다.
baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

 

· 입출력 예

baseball return
[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

 


· Thinking 1

A : 123
B : 1스트라이크 1볼.
A : 356
B : 1스트라이크 0볼.
A : 327
B : 2스트라이크 0볼.
A : 489
B : 0스트라이크 1볼.
- 스트라이크 : 숫자와 위치가 모두 맞은 경우
- 볼 : 숫자는 맞는데 위치가 틀린 경우

 

각 자리수 리스트 세개를 만들어볼까 ..?
볼인 경우에는 그 자리 제외하고 두개에 넣기
스트라이크인 경우에는 각자리에 넣기

 

baseball[i][0] : 숫자
baseball[i][1] : 스트라이크
baseball[i][2] : 볼

예를 들어서
123에 1스트라이크 1볼
one 12 3
two 2 1 3
three 2 13
356에 1스트라이크 0볼
one 1 2 3
two 2 1 3 5
trhee 2 1 3 6
327에 2스트라이크 0볼
one 1 2 3
two 2 1 3 5
three 2 1 3 6
489에 0스트라이크 1볼
one 1 2 3 8 9
two 2 1 3 5 4 9
three 2 1 3 6 4 8

근데 각자 자릿수가 다 달라; 


· Thinking 2

그냥 해볼까..

 

일단 숫자 / 스트라이크 / 볼 을 담을 int 배열 만들기
숫자:[123, 356, 327, 489]
스트라이크: [1, 1, 2, 0]
볼: [1, 0, 0, 1]

123에 1스트라이크 1볼
356에 1스트라이크 0볼
327에 2스트라이크 0볼
489에 0스트라이크 1볼

이렇게면은
스트라이크가 많은 순대로 정렬하면
327에 2스트라이크 0볼
123에 1스트라이크 1볼
356에 1스트라이크 0볼
489에 0스트라이크 1볼

327에 2스트라이크 0볼이니까 -> 가능한 숫자가 일단 : 32_ 3_7, _27
123이 1스트라이크 1볼이니까 -> 32_, 127
356에 1스트라이크 0볼이니까 -> 32,
489에 0스트라이크 1볼 -> 324, 328

327에 2스트라이크 0볼이니까 -> 가능한 숫자가 일단 : 32_ 3_7, _27
356에 1스트라이크 0볼이니까 -> 32, 3_7
123이 1스트라이크 1볼이니까 -> 32
489에 0스트라이크 1볼 -> 324, 328

 

스트라이크 기준으로 오름차순으로 정렬 (2차원 배열에서의 정렬)

Arrays.sort(baseball, new Comparator<int[]>() {
	@Override
	public int compare(final int[] entry1, int[] entry2) {
		final int time1 = entry1[1];
		final int time2 = entry2[1];
		return Integer.compare(time2, time1);
	}
});

숫자:[327, 123, 356, 489]
스트라이크: [2, 1, 1, 0]
볼: [0, 1, 0, 1]

String one = Integer.toString(num[i] / 100);
String two = Integer.toString(num[i] % 100 / 10);
String three = Integer.toString(num[i] % 10);

327에 2스트라이크 0볼이니까 -> 가능한 숫자가 일단 : 32_ 3_7, _27
123이 1스트라이크 1볼이니까 -> 32_, 127
356에 1스트라이크 0볼이니까 -> 32,
489에 0스트라이크 1볼 -> 324, 328

가능한 숫자가 32_, 3_7, _27이야
123이 1스트라이크 1볼이면 -> 32_ 가능
스트라이크 + 볼 의 합이 2면 같은 숫자 2 , 3이면 3 하;;

 

이건 아닌듯


· 완성 코드

class Solution {
    public int solution(int[][] baseball) {
        int answer = 0;
        String num = "";
        String bnum = "";

        for (int i = 123; i <= 987; i++) {
        	num = Integer.toString(i);

        	// 0 체크
        	if (num.charAt(1) == '0' || num.charAt(2) == '0')
        		continue;

        	// 중복 체크
        	if (num.charAt(0) == num.charAt(1) || num.charAt(0) == num.charAt(2) || num.charAt(1) == num.charAt(2))
        		continue;

        	for (int j = 0; j < baseball.length; j++) {
        		int ball = 0;
	        	int strike = 0;
                bnum = Integer.toString(baseball[j][0]);

                // 스트라이크 체크
                if (bnum.charAt(0) == num.charAt(0))
                    strike++;
                if (bnum.charAt(1) == num.charAt(1))
                    strike++;
                if (bnum.charAt(2) == num.charAt(2))
                    strike++;
                if (strike != baseball[j][1])
                    break;

                // 볼 체크
                if (bnum.charAt(0) == num.charAt(1) || bnum.charAt(0) == num.charAt(2))
                    ball++;
                if (bnum.charAt(1) == num.charAt(0) || bnum.charAt(1) == num.charAt(2))
                    ball++;
                if (bnum.charAt(2) == num.charAt(0) || bnum.charAt(2) == num.charAt(1))
                    ball++;
                if (ball != baseball[j][2])
                    break;
				
                if (j == baseball.length-1){
                             answer++;
                }
			}
        }
        
        return answer;
    }
}

결국 다른 사람의 질문의 참고해서..ㅠ

생각을 아예 잘못했네..
전체 경우의 수에서 그게 아닌 경우를 빼는게 훨씬 간단함

 

이 문제의 카테고리는 "완전탐색".....

 


· 문제 출처

https://programmers.co.kr/learn/courses/30/lessons/42841

 

알고리즘 연습 - 숫자 야구 | 프로그래머스

[[123, 1, 1], [356, 1, 0], [327, 2, 0], [489, 0, 1]] 2

programmers.co.kr

 

'Algorithm > Programmers' 카테고리의 다른 글

스킬 트리  (0) 2019.06.04
숫자의 표현  (0) 2019.06.04
쇠 막대기  (0) 2019.06.04
소수 찾기  (0) 2019.06.04
소수 만들기  (0) 2019.06.04

댓글