728x90
문제
문제 설명
숫자 야구 게임이란 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 |
입출력 예 설명
문제에 나온 예와 같습니다.
1~9 사이 숫자를 한번 사용해 123 ~ 987 까지의 경우를 모두 Stack 에 담는다.
Stack에서 하나씩 꺼내며 baseball[] 를 iterate 하며 strike 와 ball 의 숫자가 일치하는지 확인한다.
baseball.length 만큼의 모든 조건에 strike 와 ball 숫자가 일치한다면 answer++ 한다
import java.util.*;
class Solution {
String[] nums = {"1","2","3","4","5","6","7","8","9"};
Stack<String> st = new Stack();
public int solution(int[][] baseball) {
int answer = 0;
//3자리 수를 모두 만든다.
//{1~9까지 중복X 순서O}
int n = nums.length;
int r = 3;
LinkedList<Integer> perArr = new LinkedList();
int[] checkArr = new int[n];
permutation(n,r,perArr,checkArr);
while(st.isEmpty() == false){
String str = st.peek();
String[] num = st.pop().split("");
boolean result = true;
for(int i = 0 ; i < baseball.length ; i++){
int[] item = baseball[i];
String[] compareNum = String.valueOf(item[0]).split("");
int strike = item[1];
int ball = item[2];
//num 과 compareNum을 비교하여 strike와 ball 의 갯수가 맞을 경우 true
int comStrike = 0;
for(int j = 0 ; j < 3 ; j++){
if(num[j].equals(compareNum[j])) comStrike++;
}
int comBall = 0;
for(int j = 0 ; j < 3 ; j++){
if(str.contains(compareNum[j])) comBall++;
}
comBall = comBall - comStrike;
if(ball == comBall && strike == comStrike){
}else{
result = false;
}
}//loop of i
//
if(result) answer++;
}
return answer;
}
public void permutation(int n, int r, LinkedList<Integer> perArr, int[] checkArr){
if(r==perArr.size()){
StringBuilder builder = new StringBuilder();
for(int i : perArr){
builder.append(nums[i]);
}
st.push(new String(builder));
return;
}
for(int i = 0 ; i < n ; i++){
if(checkArr[i] == 0){
perArr.add(i);
checkArr[i] = 1;
permutation(n,r,perArr,checkArr);
perArr.removeLast();
checkArr[i] = 0;
}
}
}
}
728x90
'Algorithm > Programmers' 카테고리의 다른 글
Programmers - 타겟 넘버 (0) | 2020.08.03 |
---|---|
Programmers - 카펫 (0) | 2020.06.30 |
Programmers - 소수찾기(완전탐색) (0) | 2020.06.30 |
Programmers - ⚖️가장 큰 수 (0) | 2020.06.27 |
Programmers - 라면공장🍜 (0) | 2020.06.26 |
댓글