1. 문제
2. 나의 코드
순열과 해시맵, 완전 탐색을 이용해서 풀었다. 우선 1~9까지의 서로 다른 3자리 수를 구하는 permutation 메소드를 구현하였다. 그리고 구한 순열의 숫자와 현재 baseball에 들어온 수들과 전부 비교하여 스트라이크 수와 볼 수를 전부다 만족하는 수이면 해시맵에 그 키에 대해서 1씩 더해주었다. 결과적으로 baseball의 길이와 해시맵에 들어가 있는값이 같다면 케이스를 모두 만족하는 수이므로 answer를 1씩 증가 시켜주는 방식으로 답을 구했다.
import java.util.*;
class Solution {
private static Map<String, Integer> map;
public void permutation(boolean[] visited, int depth, String answer){
if(depth == 3){
if(answer.length() == 3)
map.put(answer, 0);
return;
}
for(int i=1;i<=9;i++){
if(visited[i] == true){
continue;
}
visited[i] = true;
permutation(visited, depth+1, answer +String.valueOf(i));
visited[i] = false;
permutation(visited, depth+1, answer);
}
}
public void countAnswer(int[] base){
for(String key : map.keySet()){
int ball = 0;
int strike = 0;
String baseValue = Integer.toString(base[0]);
//스트라이크 검사
for(int i = 0;i<3;i++){
if(key.charAt(i) == baseValue.charAt(i)){
strike+=1;
}
}
//볼 검사
for(int i = 0;i<3;i++){
for(int j=0;j<3;j++){
if(i!=j && key.charAt(i) == baseValue.charAt(j)){
ball+=1;
}
}
}
//스트라이크 수, 볼 수 맞으면 정답으로 인정
if(strike == base[1] && ball == base[2]){
map.put(key, map.get(key) + 1);
}
}
}
public int solution(int[][] baseball) {
int answer = 0;
boolean[] visited = new boolean[10];
map = new HashMap<>();
//서로 다른 3자리수로 순열 구함
permutation(visited, 0, "");
for(int[] base : baseball){
countAnswer(base);
}
int len = baseball.length;
for(String key : map.keySet()){
if(len == map.get(key))
answer++;
}
return answer;
}
}
'Algorithm' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 단어변환 (dfs/bfs) (0) | 2020.08.08 |
---|---|
[알고리즘] 프로그래머스 - 카펫 (완전탐색) (0) | 2020.07.30 |
[알고리즘] 프로그래머스-소수찾기 (완전탐색) (0) | 2020.07.20 |
백준 10974번 모든 순열 (java) (0) | 2020.07.20 |
[BAEKJOON] 2407번: 조합 (Java) (0) | 2020.07.16 |