본문 바로가기
백준

[백준] 5568번 : 카드 놓기 – JAVA [자바]

by Hongwoo 2023. 7. 26.
반응형

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

 

5568번: 카드 놓기

예제 1의 경우 상근이는 11, 12, 21, 112, 121, 122, 212를 만들 수 있다.

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 5568번 카드 놓기는 실버 4 난이도의 브루트포스 및 해시 문제이다. 이 문제에서는 N개의 숫자들이 주어지고 K개의 숫자를 이용해서 몇 개의 숫자를 만들 수 있는지를 구하면 되는 문제이다.

 

물론 다른 방법들도 있지만 이 풀이에서는 간단한 방식을 이용해서 풀어보려고 한다. 문제에서 주어진 조건은 바로 K(2 ≤ K ≤ 4)이다. 따라서, 이중, 삼중 그리고 사중 for-loop을 이용해서 풀 수 있다. 

 

예를 들어서 이중 for-loop을 했을 때 숫자를 만들고 이 숫자를 HashSet에 저장해 준다. 이 이유는 집합은 중복된 숫자를 따로 저장하지 않기 때문이다. 

 

K = 3이나 K = 4일 때도 로직 자체는 똑같다. For-loop을 이용해서 순회하고 같은 숫자는 쓰지 않고 만든 숫자는 HashSet에 추가해 준다. 그리고 마지막에 이 HashSet의 크기만 구해주면 된다.

 

이 코드의 단점은 바로 K = 2, 3, 4일 때만 쓸 수 있는 것이다. 하지만, 이게 이 문제에서 주어진 조건이므로 문제를 푸는 데에는 문제가 없다.

 

자세한 코드는 아래에 있는 코드를 참고하면 되겠다.

 


  • 코드

 

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));
        int n = Integer.parseInt(br.readLine());
        int k = Integer.parseInt(br.readLine());
        String[] arr = new String[n];
        for (int i = 0; i < n; i++) {
            arr[i] = br.readLine();
        }
        Set<String> set = new HashSet<>();
        if (k == 2) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (i == j) continue;
                    set.add(arr[i] + arr[j]);
                }
            }
        }

        if (k == 3) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (i == j) continue;
                    for (int z = 0; z < n; z++) {
                        if (i == z || j == z) continue;
                        set.add(arr[i] + arr[j] + arr[z]);
                    }
                }
            }
        }

        if (k == 4) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (i == j) continue;
                    for (int y = 0; y < n; y++) {
                        if (i == y || j == y) continue;
                        for (int z = 0; z < n; z++) {
                            if (i == z || j == z || y == z) continue;
                            set.add(arr[i] + arr[j] + arr[y] + arr[z]);
                        }
                    }
                }
            }
        }
        System.out.println(set.size());
    }



}

 

 

반응형

댓글