프로그래머스 문제풀이, 숫자야구
12 Jun 2019 | java Programmers프로그래머스 - 숫자 야구
문제 설명
문제설명 바로가기
- 제한사항
- 질문의 수는 1 이상 100 이하의 자연수입니다.
- baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
- 푼방식
- 숫자야구에서 쓸수있는 수를 만든다. 모든 자릿수의 숫자가 겹치면 안됨, 0도 올수없음.
- 만든 숫자와, 2차원 배열로 주어진 숫자를 통해서 값을 비교해서 스트라이크와 볼의 갯수를 구한다.
- 볼 - 스트라이크값을 반드시 해주어야한다. 예를 들면 답이 132일 경우, 주어진 값이 123이면 1스트라이크 3ball이 아니다.
- 1 strike, 2ball이다. contains로 구하면 이런 경우를 생각해서 볼에서 스트라이크 값을 빼야한다
- 모든 baseball 배열에서 주어진 스트라이크 볼 값과 동일 해야함
public class Programmers42841 {
public static void main(String[] args) {
Programmers42841 program = new Programmers42841();
System.out.println(program.solution(baseball));
}
public int solution(int[][] baseball) {
int answer = 0;
// 일단은 겹치지 않는 숫자를 만들자
List<String> list = new ArrayList<>();
int s = 0;
int b = 0;
int s1 = 0;
int b1 = 0;
for(int i = 1; i < 10; i++) {
for(int j = 1; j < 10; j++) {
for(int k = 1; k < 10; k++) {
if(i != j && j != k && i != k) {
list.add(String.valueOf(i * 100 + j * 10 + k));
}
}
}
}
for(int i=0; i<list.size(); i++){
String temp = list.get(i);
int cnt = 0;
for (int j = 0; j < baseball.length && cnt < baseball.length; j++) {
s = baseball[j][1];
b = baseball[j][2];
s1 = strike(temp,Integer.toString(baseball[j][0]));
b1 = ball(temp,Integer.toString(baseball[j][0])) - s1;
if(s1 == s && b == b1)
cnt++;
// 베이스볼 같은 경우, 베이스의 볼의 숫자 모두와 일치하는 경우의 수만 정답
// 123, 356, 327, 489를 통해서 얻은 스트라이크와 볼 갯수가 모두 일치하는 숫자만 정답..!
// 하나라도 일치하는 경우의 수로 구할경우 정답이 나오지 않는다.. 이런 디테일이 중요함!!
if(cnt == baseball.length)
answer++;
}
}
return answer;
}
public static int strike(String num, String target) {
int cnt = 0;
for(int i = 0; i < target.length(); i++) {
cnt = num.charAt(i) == target.charAt(i) ? cnt + 1 : cnt;
}
return cnt;
}
public static int ball(String num, String target) {
int cnt = 0;
for(int i = 0; i < target.length(); i++) {
cnt = num.contains(String.valueOf(target.charAt(i))) ? cnt + 1 : cnt;
}
return cnt;
}
}
Comments