Problem Solving/Baekjoon

[백준] 9575 행운의 수 - Data Structure / Java

graycode 2023. 4. 26. 21:36

 문제 링크

 

9575번: 행운의 수

각각의 테스트 케이스마다 입력으로 주어진 수열을 이용해 만들 수 있는 서로 다른 행운의 수의 개수를 한 줄에 하나씩 출력한다.

www.acmicpc.net

 

 풀이 과정

입력을 일반적인 반복문으로 처리 시 성능 상 이점이 있지만,

이 풀이에서는 Stream API 를 활용하여 중복을 제거한 세 수열을 입력받았다.

 

수열의 크기가 50을 넘지 않으므로 가능한 모든 합의 경우를 구해,

해당 수의 자릿수 중 5 또는 8 이 포함하는 지 확인하여 Set 에 저장해 행운의 수를 구한다.

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

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 t = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        while (t-- > 0) {
            br.readLine();
            int[] a = macro(br.readLine());

            br.readLine();
            int[] b = macro(br.readLine());

            br.readLine();
            int[] c = macro(br.readLine());

            Set<Integer> set = new HashSet<>();
            for (int i : a) {
                for (int j : b) {
                    for (int k : c) {
                        int sum = i + j + k;
                        if (check(sum))
                            set.add(sum);
                    }
                }
            }

            sb.append(set.size()).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }

    private static boolean check(int n) {
        while (n != 0) {
            if (n % 10 != 5 && n % 10 != 8)
                return false;
            n /= 10;
        }

        return true;
    }

    private static int[] macro(String input) {
        return Arrays.stream(input.split(" ")).mapToInt(Integer::parseInt).distinct().toArray();
    }

}