문제
https://www.acmicpc.net/problem/2503
2503번: 숫자 야구
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트
www.acmicpc.net
import java.util.Scanner;
public class Main2503 {
static int N;
static String[] number;
static int[][] strikeBall;
static int[] arr;
static boolean[] visit;
static int sum; //해당 조건 충족될 경우 카운트
public static void compare(String temp) {
int[][] result = new int[N][2];
int count = 0; //number의 조건이 충족될 때 카운트
for (int i=0; i<N; i++) {
for (int j=0; j<3; j++) {
if (number[i].charAt(j) == temp.charAt(j)) {
result[i][0]++; //strike
}
if (number[i].contains(String.valueOf(temp.charAt(j)))) {
if (number[i].charAt(j) != temp.charAt(j)) {
result[i][1]++; //ball
}
}
}
}
for (int i=0; i<N; i++) {
if (result[i][0] == strikeBall[i][0] && result[i][1] == strikeBall[i][1]) {
count++;
}
}
if (N == count) {
sum++;
}
}
public static void question(int cnt) {
String temp = "";
if (cnt == arr.length) {
for (int i=0; i<arr.length; i++) {
temp += arr[i];
}
compare(temp);
} else {
for (int i=1; i<10; i++) {
if (!visit[i-1]) {
arr[cnt] = i;
visit[i-1] = true;
question(cnt+1);
visit[i-1] = false;
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
number = new String[N];
strikeBall = new int[N][2];
arr = new int[3];
visit = new boolean[9];
for(int i=0; i<N; i++) {
number[i] = sc.next();
for (int j=0; j<2; j++) {
strikeBall[i][j] = sc.nextInt();
}
}
sc.close();
question(0);
System.out.println(sum);
}
}
1. 메모리초과나 시간초과가 날거라 예상했지만 다행히 정답이다.
2. 풀면서 시작방향을 제대로 잡지 못해 많이 헤맸다. 결국 1차원 배열 + 2차원 배열의 조합으로 접근해서 해결했다. 다른 블로그의 글들을 보니 class를 생성해서 참조형 인스턴스로 비교를 하는데 그 방법이 자바라는 언어의 특성에 더욱 맞는듯 하다. 아직도 주먹구구식으로 문제를 푸는데 이는 좋지 못한 방법이다.
3. 또한 변수명의 정의도 눈앞에 보이는 것만 해결하려다보니 난잡하고 뜻을 알아보기 힘들다. 작성을 마친 후 다시 수정하면 할수 있겠지만 실제 코테에서 그렇게 하기엔 쉽지 않을듯하다. 그러니 문제파악 후 전체적인 틀을 어떻게 잡아야 할지에 대해 충분히 고민을 하는것이 중요하다.
4. 마지막으로 또 많이 헤맸던 부분이 count와 sum의 차이다. count는 질문별로 strike, ball이 일치했을 때 카운팅을 하는 것이고 sum은 count가 N과 동일한 경우, 즉 N개의 질문에 대한 조건을 모두 충족한 수를 찾았을 때 카운팅하는 변수다. count로 출력하다보니 계속 3자리수의 수가 나와서 당황했었다.
5. 문제 접근방법에 대한 실력도 늘고, 완전탐색을 어떻게 풀어나갈지에 대한 감은 잡은 듯하다. 하지만 세세한 부분들과 전체적인 밑그림을 그리는 것은 아직도 미숙하다. 앞으로도 많은 문제를 풀며 이러한 문제점을 계속해서 고쳐나가야 한다.
'백준' 카테고리의 다른 글
백준 2667번 ☆ (0) | 2022.11.21 |
---|---|
백준 17626번 ☆ (0) | 2022.11.19 |
백준 5568번 (0) | 2022.11.17 |
백준 2422번 (0) | 2022.11.16 |
백준 2661번 ☆ (0) | 2022.11.15 |