문제

숫자 야구 게임이란 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의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.

나의 코드

class Solution {
    public int solution(int[][] baseball) {
        int answer = 0;
        for(int i=1; i<=9; i++) {
        	for(int j=1; j<=9; j++) {
        		for(int k=1; k<=9; k++) {
        			if(i==j || j==k || i==k) continue;
        			int comp = 0;
        			for(int[] base : baseball) {
        				int one = base[0]/100;
        				int two = base[0]%100/10;
        				int three = base[0]%10;
        				int strike = 0;
        				int ball = 0;
        				if(one==i) strike++;
        				if(two==i || three==i) ball++;
        				if(two==j) strike++;
        				if(one==j || three==j) ball++;
        				if(three==k) strike++;
        				if(one==k || two==k) ball++;
        				
        				if(base[1]==strike && base[2]==ball) comp++;
        			}
        			if(comp==baseball.length) answer++;
        		}
        	}
        }
        return answer;
    }
}

나의 풀이

문제를 잘 해석해야 할 것이다. 진짜 코드 몇 글자 때문에 몇 시간을 날렸는지 모르겠다.

문제의 핵심은 0의 값이 안 들어간다는 것과 중복되는 숫자가 없어야 된다는 것.

1. 3중 for문을 이용하여 111에서 999까지 돌린다.

2. if문을 통해 중복되는 숫자를 체크해서 있다면 continue 해서 다음 숫자로 넘어간다.

3. comp는 마지막에 baseball 2차원 배열의 길이와 비교해줄 변수이다.

4. for문을 이용해 baseball에 담겨있는 추리들을 하나씩 가져온다.

5. int one, two, thee는 각각 첫째 자리와 둘째 자리, 셋째 자리를 저장할 변수이다.

6. strike와 ball은 이름에 나와있듯이 스트라이크 횟수와 볼의 횟수를 저장할 변수이다.

7. 순서대로 만약 one과 i가 같다면 strike 그 외에 같은 게 있다면 ball, k까지 비교해준다.

8. 그러면 baseball의 strike(1) 와 ball(2) 을 비교해서 모두 맞다면 comp++ 해준다.

9. 마지막으로 comp의 크기와 baseball의 length를 비교한다. 이게 맞다는 건 모든 경우의 수를 통과했다는 것.

10. answer를 return 해준다.

 

+ Recent posts