6443번: 애너그램백준/문제2024. 4. 8. 14:13
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/6443
언어 : Kotlin
문제 설명 :
씬디는 애너그램(anagram) 프로그램을 만들어 줄 수 있는 남자를 좋아한다. 참고로 씬디는 매우 예쁘다.
애너그램 프로그램이란, 입력받은 영단어의 철자들로 만들 수 있는 모든 단어를 출력하는 것이다. 가령 "abc" 를 입력받았다면, "abc", "acb", "bac", "bca", "cab", "cba" 를 출력해야 한다.
입력받은 단어내에 몇몇 철자가 중복될 수 있다. 이 경우 같은 단어가 여러 번 만들어 질 수 있는데, 한 번만 출력해야 한다. 또한 출력할 때에 알파벳 순서로 출력해야 한다.
입력 :
첫째 줄에 단어의 개수 N 이, 둘째 줄부터 N개의 영단어가 들어온다. 영단어는 소문자로 이루어져 있다. 단어의 길이는 20보다 작거나 같고, 애너그램의 수가 100,000개 이하인 단어만 입력으로 주어진다.
출력 :
각각의 영단어마다 모든 가능한 애너그램을 출력한다. 각각의 영단어에 대한 애너그램을 출력할 때, 알파벳 순서로 중복되지 않게 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
2 abc acba |
abc acb bac bca cab cba aabc aacb abac abca acab acba baac baca bcaa caab caba cbaa |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.*
lateinit var arr: IntArray
lateinit var stack: Stack<Char>
val strList = mutableListOf<String>()
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val n = readLine().toInt()
repeat(n) {
arr = IntArray(26) { 0 }
val input = readLine().toCharArray().onEach {
arr[it - 'a']++
}
stack = Stack<Char>()
permutation(input.size)
}
strList.forEach { bw.appendLine(it) }
bw.flush()
bw.close()
}
fun permutation(length: Int) {
if (length == stack.size) {
strList += stack.joinToString("")
}
for (i in 0 until 26) {
if (arr[i] > 0) {
arr[i]--
stack.push((i + 'a'.code).toChar())
permutation(length)
stack.pop()
arr[i]++
}
}
}
'백준 > 문제' 카테고리의 다른 글
7600번: 문자가 몇갤까 (0) | 2024.04.09 |
---|---|
9946번: 단어 퍼즐 (0) | 2024.04.08 |
1283번: 단축키 지정 (0) | 2024.04.08 |
3765번: Celebrity jeopardy (0) | 2024.04.05 |
1855번: 암호 (0) | 2024.04.05 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!