백준/Java

[백준 1622] 공통 순열 - JAVA

SH3542 2024. 10. 28. 19:46

BOJ Link

 

 

 

풀이 과정

1.  a의 부분 수열의 순열이자 b의 부분 수열의 순열이 되는 가장 긴 문자열 x의 사전 순으로 가장 앞에 오는 것을 출력?

 

한마디로 a와 b가 공통으로 가진 원소 집합을 찾아 정렬하면 된다.

 

map으로 a와 b의 <원소, 개수>를 저장한 뒤 공통 원소만 뽑는다.

둘 다 어떤 원소를 가지고 있다면, 둘 중 더 적은 개수가 공통 원소가 된다.

 

2. 입력에는 빈 문자열이 올 수 있으며, EOF 처리를 해야함

 

전자의 조건은 놀랍게도 명시되어 있지 않다. 유추해서 처리해야 한다.

if ("".equals(A) || "".equals(B)) {
    System.out.println();
    continue;
}
while ((A = br.readLine()) != null) {

 

 

제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String A = "";
        String B = "";

        while ((A = br.readLine()) != null) {
            B = br.readLine();

            if ("".equals(A) || "".equals(B)) {
                System.out.println();
                continue;
            }

            Map<Character, Integer> aMap = new HashMap<>();
            Map<Character, Integer> bMap = new HashMap<>();

            Arrays.stream(A.split("")).forEach(s -> aMap.merge(s.charAt(0), 1, (ov, nv) -> ov + 1));
            Arrays.stream(B.split("")).forEach(s -> bMap.merge(s.charAt(0), 1, (ov, nv) -> ov + 1));

            List<Character> output = new ArrayList<>();

            for (Map.Entry<Character, Integer> aEntry : aMap.entrySet()) {

                char aKey = aEntry.getKey();

                if (bMap.containsKey(aKey)) {
                    int total = Math.min(aEntry.getValue(), bMap.get(aKey));

                    while (total > 0) {
                        output.add(aKey);
                        total--;
                    }
                }
            }

            output.stream().sorted().forEach(System.out::print);
            System.out.println();
        }
    }
}

'백준 > Java' 카테고리의 다른 글

[백준 1965] 상자넣기 - JAVA  (0) 2024.10.31
[백준 1679] 숫자놀이 - JAVA  (0) 2024.10.28
[백준 1474] 밑 줄 - JAVA  (0) 2024.10.28
[백준 1325] 효율적인 해킹 - JAVA  (0) 2024.10.28
[백준 1515] 수 이어 쓰기 - JAVA  (0) 2024.10.27