반응형
https://www.acmicpc.net/problem/2503
2503번: 숫자 야구
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트
www.acmicpc.net


풀이
브루트포스, 구현 문제는 개인적으로 너무 어렵다..
나만의 팁이라고 한다면 dp처럼 공책에다가 써본 후에 로직을 어느 정도 파악하고 코딩을 시작한다.
위 문제의 조건은 아래와 같다.
- 범위는 세 자릿수
- 자릿수와 숫자가 같으면 스트라이크
- 자릿수가 다르고, 숫자가 같은 게 있으면 볼
그럼 이제 문제를 풀어보겠다.
[1번 조건]
세 자릿수를 가진 자연수는 100 부터 999 이다.
하지만 중복된 숫자와 0이 들어가면 안되기 때문에 범위는 123 부터 987 이다.
for (int i=123; i<988; i++) { int a2 = i / 100; // 100의 자리 int b2 = i / 10 - (a2 * 10); // 10의 자리 int c2 = i % 10; // 1의 자리 // 0이 포함되거나 중복된 수가 있는 경우 if (a2 == 0 || b2 == 0 || c2 == 0 || a2 == b2 || a2 == c2 || b2 == c2) continue; if (find(a2, b2, c2)) { cnt++; } }
[2, 3번 조건]
해당 범위를 돌면서 민혁이가 질문한 숫자, 스트라이크, 볼이 같으면 영수가 생각한 숫자의 후보가 된다.
public static boolean find(int a2, int b2, int c2) { for (int i=0; i<arrList.size(); i++) { Number number = arrList.get(i); int a1 = number.num / 100; // 100의 자리 int b1 = number.num / 10 - (a1 * 10); // 10의 자리 int c1 = number.num % 10; // 1의 자리 int st1 = number.strike; int ba1 = number.ball; int st2 = 0; int ba2 = 0; // 스트라이크 if (a1 == a2) st2++; if (b1 == b2) st2++; if (c1 == c2) st2++; // 볼 if (a2 == b1 || a2 == c1) ba2++; if (b2 == a1 || b2 == c1) ba2++; if (c2 == a1 || c2 == b1) ba2++; if (st1 != st2 || ba1 != ba2) { return false; } } return true; }
<최종코드>
import java.io.*; import java.util.*; public class Main { static ArrayList<Number> arrList; public static class Number { int num; int strike; int ball; public Number (int num, int strike, int ball) { this.num = num; this.strike = strike; this.ball = ball; } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; int N = Integer.parseInt(br.readLine()); arrList = new ArrayList<>(); for (int i=0; i<N; i++) { st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int s = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); arrList.add(new Number(n, s, b)); // 질문 } int cnt = 0; for (int i=123; i<988; i++) { int a2 = i / 100; // 100의 자리 int b2 = i / 10 - (a2 * 10); // 10의 자리 int c2 = i % 10; // 1의 자리 // 0이 포함되거나 중복된 수가 있는 경우 if (a2 == 0 || b2 == 0 || c2 == 0 || a2 == b2 || a2 == c2 || b2 == c2) continue; if (find(a2, b2, c2)) { cnt++; } } System.out.println(cnt); } public static boolean find(int a2, int b2, int c2) { for (int i=0; i<arrList.size(); i++) { Number number = arrList.get(i); int a1 = number.num / 100; // 100의 자리 int b1 = number.num / 10 - (a1 * 10); // 10의 자리 int c1 = number.num % 10; // 1의 자리 int st1 = number.strike; int ba1 = number.ball; int st2 = 0; int ba2 = 0; // 스트라이크 if (a1 == a2) st2++; if (b1 == b2) st2++; if (c1 == c2) st2++; // 볼 if (a2 == b1 || a2 == c1) ba2++; if (b2 == a1 || b2 == c1) ba2++; if (c2 == a1 || c2 == b1) ba2++; if (st1 != st2 || ba1 != ba2) { return false; } } return true; } }
내가 생각한 시간 복잡도: O(864N)
반응형
'알고리즘 > 구현 & 그리디 & 브루트포스' 카테고리의 다른 글
[백준]JAVA - 10773번: 제로 (0) | 2022.11.21 |
---|---|
[백준]JAVA - 1913번: 달팽이 (0) | 2022.11.20 |
[백준]JAVA - 1034번: 램프 (0) | 2022.11.12 |
[백준]JAVA - 1202번: 보석 도둑 (0) | 2022.10.21 |
[백준]JAVA - 11399번: ATM (0) | 2022.10.20 |