algorithm/프로그래머스
[프로그래머스] 숫자 야구 (07.20)
자바왕세자
2020. 7. 20. 23:29
문제
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
접근법
완전 탐색이라는 분류에 맞게 가능한 모든 경우의 수를 체크했다.
범위가 세 자리 수로 많지 않으므로 123부터 897까지 직접 확인했다.
문제에서 서로 다른 세개의 수라고 했으므로 세 숫자는 모두 달라야 하고 1~9까지의 범위라고 했으므로 0이 들어가면 안되는 조건을 고려하여 진행하였다.
코드
import java.util.*;
class Solution {
public int solution(int[][] baseball) {
Set<String> set = new HashSet<>();
for(int i=123; i<=987; i++){
boolean isTrue = false;
String num = String.valueOf(i);
String[] numArr = num.split("");
if(numArr[0].equals("0") || numArr[1].equals("0") || numArr[2].equals("0"))
continue;
if(numArr[0].equals(numArr[1]) || numArr[1].equals(numArr[2]) || numArr[2].equals(numArr[0]))
continue;
for(int j=0;j<baseball.length;j++){
if(!checkStrikeAndBall(num, String.valueOf(baseball[j][0]), baseball[j][1], baseball[j][2])){
isTrue = true;
break;
}
}
if(!isTrue)
set.add(num);
}
return set.size();
}
public boolean checkStrikeAndBall(String num1, String num2, int strike, int ball){
String[] num1Arr = num1.split("");
String[] num2Arr = num2.split("");
for(int i=0;i<3;i++){
if(num1Arr[i].equals(num2Arr[i]))
strike --;
}
List<String> list = Arrays.asList(num2Arr);
for(int i=0;i<3;i++){
System.out.println(list.indexOf(num1Arr[i]));
if(list.contains(num1Arr[i]) && list.indexOf(num1Arr[i]) != i){
ball--;
}
}
if(strike == 0 && ball == 0)
return true;
return false;
}
}