반응형
https://www.acmicpc.net/problem/5568
- 문제
- 문제 풀이
백준 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());
}
}
반응형
'백준' 카테고리의 다른 글
[백준] 20920번 : 영단어 암기는 괴로워 – JAVA [자바] (0) | 2023.07.26 |
---|---|
[백준] 25192번 : 인사성 밝은 곰곰이 – JAVA [자바] (0) | 2023.07.26 |
[백준] 26069번 : 붙임성 좋은 총총이 – JAVA [자바] (0) | 2023.07.25 |
[백준] 2910번 : 빈도 정렬 – JAVA [자바] (0) | 2023.07.25 |
[백준] 20291번 : 파일 정리 – JAVA [자바] (0) | 2023.07.18 |
댓글