문제
https://www.acmicpc.net/problem/5568
5568번: 카드 놓기
예제 1의 경우 상근이는 11, 12, 21, 112, 121, 122, 212를 만들 수 있다.
www.acmicpc.net
알고리즘
Hash + 순열
풀이
1. 순열을 통해 카드를 선택할 수 있는 모든 경우의 수를 파악
2. 선택했던 카드를 또 선택하지 못하게 visit[] 배열을 통해 중복 체크
3. K개를 뽑았다면 Hash를 통해 만든 카드 경우의수를 체크
코드
package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
public class Test_Hash {
static int N, K;
static List<String> list;
//뽑은 카드 체크
static boolean[] visit;
//만들 수 있는 카드
static HashSet<String> card;
static int ans;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(bf.readLine());
K = Integer.parseInt(bf.readLine());
list = new ArrayList<>();
visit = new boolean[N];
card = new HashSet<>();
for (int i = 0; i < N; i++) {
list.add((bf.readLine()));
}
pick(0, "");
System.out.println(ans);
}
//카드를 K만큼 고른다. (순열)
public static void pick(int cnt, String s) {
if (cnt == K) {
if(card.contains(s)) return;
card.add(s);
ans++;
return;
}
for (int i = 0; i < N; i++) {
if(visit[i]) continue;
visit[i] = true;
pick(cnt + 1, s+list.get(i));
visit[i] = false;
}
}
}
'Algorithm (PS) > 백준' 카테고리의 다른 글
[백준 5568] 구간 합 구하기 4 (Java) [누적합] (0) | 2023.08.08 |
---|---|
[백준] 11404 플로이드 (Java) [FloydWashal] (1) | 2023.07.28 |
[백준] 2252. 줄세우기(Java) [위상정렬] (0) | 2023.07.25 |
[백준] 1922 (Java) [MST 알고리즘] (0) | 2023.07.25 |
[백준] 1717 집합의 표현(Java) [Union-Find] (0) | 2023.07.24 |