본문 바로가기
코딩테스트

[완전탐색] 백준 2503번 숫자야구

by Enhydra lutris 2022. 10. 6.

 

 

 

https://www.acmicpc.net/problem/2503

 

2503번: 숫자 야구

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트

www.acmicpc.net

이문제를 풀려면 각 자릿수의 값을 비교해가면서 풀어야 하는데

1. 나눗셈으로 각 자릿수 숫자 찾아서 비교하기

2. 문자열로 바꿔서 비교하기

이렇게 두개로 나뉘는거 같다 나는 첫번째 방법으로 했는데 다풀고 나니 뭔가 2번이 더 간단했을 것 같은 느낌이 조금 든다.

 

각 자리에 1~9의 숫자가 곂치지 않게 나오기 때문에 123~987의 영역을 탐색해야 한다.

그리고 123~987영역에는 0이 들어간 값과, 222 처럼 숫자가 곂치는 값이 존재하기 때문에 그 값들을 제외하고 탐색해야 한다.

위에서 말한 탐색 영역에서 N개의 조건을 만족하는 개수를 찾으면 된다.

import java.util.ArrayList;
import java.util.Scanner;
import java.lang.Math;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int [][] arr = new int[N][3];
        int result = 0;


        for(int i=0; i<N; i++){
            arr[i][0] = sc.nextInt();
            arr[i][1] = sc.nextInt();
            arr[i][2] = sc.nextInt();
        }

        for(int i = 123; i <= 987; i++){
            int num = i;
            int countAnswer = 0;

            ArrayList<Integer> digit = new ArrayList<>();
            while(num > 0){                      //각 자릿수 값 구하기
                digit.add(num % 10);
                num /= 10;
            }
            if(digit.get(0)==digit.get(1)       //중복이나 0들어간 값 삭제
                    ||digit.get(0)==digit.get(2)
                    ||digit.get(1)==digit.get(2)
                    ||digit.contains(0)){
                continue;
            }

            for (int j = 0; j < N; j++){       //스트라이크 개수 세기
                int countStrike = 0;
                int countBall = 0;
                for(int k = 0; k < 3; k++){
                    if (Math.floor(arr[j][0]%Math.pow(10,k+1)/Math.pow(10,k))==digit.get(2-k)){
                        countStrike++;
                    }
                }
                for(int k = 0; k < 3; k++){    //볼 개수 세기
                    for (int l = 0; l < 3; l++){
                        if(Math.floor(arr[j][0]%Math.pow(10,k+1)/Math.pow(10,k))==digit.get(l))
                            countBall++;
                    }
                }
                countBall -= countStrike;  //같은 숫자가 존재한다면 볼로 카운트 했기 때문에 countBall에 스트라이크가 까지 들어있다. 따라서 스트라이크 개수는 제외해줘야 함
                
                if(countStrike == arr[j][1] && countBall == arr[j][2])
                    countAnswer++;
            }
            if (countAnswer == N) result++;  //질문을 모두 만족해야지 정답이 될 수 있다.
        }
        System.out.println(result);
    }
}

Math.floor(숫자)

소숫점 제거

 

Math.pow(a, b)

Math.pow(a, b)는 a^b

 

문제 풀면서 for문에 자꾸 값 잘못 넣어서 오류가 났다.

역시 자릿수 구하는 문제들은 좀 헷갈린다 ㅠㅠ

각 자릿수 구하는 부분은 메소드로 만들었으면 더 좋았을 것 같지만 오늘은 할일이 많으니까 여기까지~

 

 

댓글