백준 2503번 - 숫자 야구

황제연·2024년 9월 18일
0

알고리즘

목록 보기
106/169
post-thumbnail

문제 탐색하기

입력 자료 정리하기

  1. 입력값 n은 이후 들어오는 숫자야구 게임의 수다
  2. 이후 들어오는 3가지 값은 각각 세자리 숫자, 스트라이크 수, 볼의 수이다

해결방법 추론

  1. 숫자 야구 규칙을 생각했을 때, 나올 수 있는 경우의 수는
    123 ~ 987까지이다.
  2. 위 경우의 수는 중복되지 않는 숫자들의 최소~최대 범위이다
  3. 이 범위 내에서도 조건에 해당되지 않는 숫자들을 걸러내야 한다
  4. 세자리 숫자중 하나라도 0이거나, 같은 숫자가 있는 경우는 미리 제외한다
  5. 위 조건을 미리 해둔 뒤에 숫자야구 게임을 시작하면 해결할 수 있을 것이다
  6. 숫자 야구 게임에서는 스트라이크와 볼의 개수를 세어주어야 한다
  7. 모든 숫자들에 대해서 입력 수와 비교하여, 스트라이크와 볼의 개수를 세어준다
  8. 그리고 만약 스트라키으와 볼의 개수가 같다면 답의 개수로 세어주면
    문제를 해결할 수 있을 것이다

시간복잡도 계산

  1. n x 123~988 x 3 x 3의 연산이 최대가 된다
  2. 따라서 시간복잡도는 O(n)이고 시간 제한안에 문제를 해결할 수 있다

코드 설계하기

입력값 상태 관리하기

  1. 입력값은 모두 변수로 받아 관리한다.

브루트포스, 출력 설계

  1. 123~987까지 탐색하면서, 앞서 제외한 수가 아니라면
    스트라이크와 볼의 개수를 탐색한다
  2. 3 x 3 연산으로 입력받은 수와 현재 탐색한 수의 세자리를 모두 탐색한다
  3. 탐색하면서 스트라이크와 볼의 개수를 세어주고
    입력받은 스트라이크 수와 볼의 수와 비교하여 같으면 정답 수로 세어준다
  4. 이후 정답 수를 출력하면 정답이 된다

정답 코드

(1회차 시도 성공!)

import java.io.*;
import java.util.*;

public class Main {


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        boolean[] arr = new boolean[1000];
        for (int i = 123; i < 988; i++) {
            String s = String.valueOf(i);
            if(s.charAt(0) == '0' || s.charAt(1) == '0' || s.charAt(2) == '0'){
                continue;
            }
            if(s.charAt(0) == s.charAt(1) || s.charAt(1) == s.charAt(2) || s.charAt(0) == s.charAt(2)){
                continue;
            }
            arr[i] = true;
        }

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int num = Integer.parseInt(st.nextToken());
            int strike = Integer.parseInt(st.nextToken());
            int ball = Integer.parseInt(st.nextToken());
            for (int j = 123; j < 988; j++) {
                if(arr[j]){
                    int strikeCount = 0;
                    int ballCount = 0;
                    for (int k = 0; k < 3; k++) {
                        String s1 = String.valueOf(num);
                        for (int l = 0; l < 3; l++) {
                            String s2 = String.valueOf(j);
                            if(s1.charAt(k) == s2.charAt(l) && k == l){
                                strikeCount++;
                            }
                            if(s1.charAt(k) == s2.charAt(l) && k!=l){
                                ballCount++;
                            }
                        }
                    }

                    if(strike == strikeCount && ball == ballCount){
                        arr[j] = true;
                    }else{
                        arr[j] = false;
                    }
                }
            }

        }

        int ans = 0;
        for (int i = 123; i < 988; i++) {
            if(arr[i]){
                ans++;
            }
        }
        bw.write(ans+"");


        br.close();
        bw.close();
    }

}

문제 링크

2503 - 숫자 야구

profile
Software Developer

0개의 댓글