문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42841
문제 설명
숫자 야구 게임이란 2명이 서로가 생각한 숫자를 맞추는 게임입니다.
각자 서로 다른 1~9까지 3자리 임의의 숫자를 정한 뒤 서로에게 3자리의 숫자를 불러서 결과를 확인합니다. 그리고 그 결과를 토대로 상대가 정한 숫자를 예상한 뒤 맞힙니다.
- 숫자는 맞지만, 위치가 틀렸을 때는 볼
- 숫자와 위치가 모두 맞을 때는 스트라이크
- 숫자와 위치가 모두 틀렸을 때는 아웃
제한사항
- 질문의 수는 1 이상 100 이하의 자연수입니다.
- baseball의 각 행은 [세 자리의 수, 스트라이크의 수, 볼의 수] 를 담고 있습니다.
풀이 순서
- 123 ~ 987까지 가능한 3자리 모든 경우의 수 반복 (제외 1) 0이 포함되는 숫자-100, 제외 2) 서로 중복되는 수-111)
- 위 범위 숫자중 제외1), 제외2) 조건에 만족되는 숫자 제외
- baseball 배열의 세 자리의 수(var: cmp), 스트라이크의 수(var: strike), 볼의 수(var: ball) 체크
class Solution {
public int solution(int[][] baseball) {
int answer = 0;
// 풀이 순서 1: 모든 세자리 경우의 수
for(int i=123; i<988; i++){
String tmp = i+"";
// 풀이 순서 2: 제외 조건1), 2)
if(tmp.contains("0")){
continue;
}
if((tmp.charAt(0) == tmp.charAt(1)) || (tmp.charAt(0) == tmp.charAt(2)) ||
(tmp.charAt(1) == tmp.charAt(2))){
continue;
}
// 풀이 순서 3: baseball의 세자리수(cmp)와 체크하고자 하는 세자리수(tmp)
// strike수와 st_cnt, ball수와 b_cnt 개수 비교
boolean flag = true;
for (int j=0; j<baseball.length; j++){
int strike = baseball[j][1];
int ball = baseball[j][2];
String cmp = baseball[j][0]+"";
int st_cnt = 0;
int b_cnt = 0;
for(int k=0; k<3; k++){
if(cmp.charAt(k) == tmp.charAt(k)){
st_cnt += 1;
}
if(cmp.charAt(k) != tmp.charAt(k)){
if(tmp.contains(cmp.charAt(k)+"")){
b_cnt +=1;
}
}
}
if(ball != b_cnt || strike != st_cnt){
flag = false;
break;
}
}
if(flag){
answer += 1;
}
}
return answer;
}
}
'Algorithm' 카테고리의 다른 글
[프로그래머스 - 정렬] H-Index (0) | 2020.01.27 |
---|---|
[프로그래머스 - 정렬] 가장 큰수 (0) | 2020.01.27 |
[프로그래머스 - 스택/큐] 다리를지나는트럭 (0) | 2020.01.27 |
[프로그래머스 - 해시] 베스트앨범 (0) | 2020.01.27 |
[프로그래머스 - 완전탐색] 소수찾기 (0) | 2020.01.27 |