문제 출처 : https://www.acmicpc.net/problem/1543
언어 : Kotlin
문제 설명 :
세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한다. 예를 들어, 문서가 abababa이고, 그리고 찾으려는 단어가 ababa라면, 세준이의 이 함수는 이 단어를 0번부터 찾을 수 있고, 2번부터도 찾을 수 있다. 그러나 동시에 셀 수는 없다.
세준이는 문서와 검색하려는 단어가 주어졌을 때, 그 단어가 최대 몇 번 중복되지 않게 등장하는지 구하는 프로그램을 작성하시오.
- 첫째 줄에 문서가 주어진다. 문서의 길이는 최대 2500이다. 둘째 줄에 검색하고 싶은 단어가 주어진다. 이 길이는 최대 50이다. 문서와 단어는 알파벳 소문자와 공백으로 이루어져 있다.
- 첫째 줄에 중복되지 않게 최대 몇 번 등장하는지 출력한다.
제한 사항 :
- 시간 제한 : 2초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
ababababa aba |
2 |
a a a a a a a |
2 |
ababababa ababa |
1 |
aaaaaaa aa |
3 |
풀이 :
import java.io.BufferedWriter
import java.io.OutputStreamWriter
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val doc = readLine()
val sample = readLine()
var cnt = 0
var index = 0
while (index <= doc.length - sample.length) {
var wIndex = 0
while (wIndex < sample.length && sample[wIndex] == doc[index + wIndex]) wIndex++
if (wIndex == sample.length) { cnt++; index += wIndex } else index++
}
bw.write("$cnt")
bw.flush()
bw.close()
}
문제 출처 : https://www.acmicpc.net/problem/5052
언어 : Kotlin
문제 설명 :
전화번호 목록이 주어진다. 이때, 이 목록이 일관성이 있는지 없는지를 구하는 프로그램을 작성하시오.
전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다.
예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자
- 긴급전화: 911
- 상근: 97 625 999
- 선영: 91 12 54 26
이 경우에 선영이에게 전화를 걸 수 있는 방법이 없다. 전화기를 들고 선영이 번호의 처음 세 자리를 누르는 순간 바로 긴급전화가 걸리기 때문이다. 따라서, 이 목록은 일관성이 없는 목록이다.
- 첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 하나씩 주어진다. 전화번호의 길이는 길어야 10자리이며, 목록에 있는 두 전화번호가 같은 경우는 없다.
- 각 테스트 케이스에 대해서, 일관성 있는 목록인 경우에는 YES, 아닌 경우에는 NO를 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 256MB
입출력 예 :
입력 | 출력 |
2 3 911 97625999 91125426 5 113 12340 123440 12345 98346 |
NO YES |
다른 사람의 풀이 :
import java.io.BufferedWriter
import java.io.OutputStreamWriter
data class Node(val child: MutableMap<Int, Node> = mutableMapOf(), var terminal: Boolean = false)
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
repeat(readLine().toInt()) {
val trie = Trie()
repeat(readLine().toInt()) {
trie.add(readLine())
}
bw.appendLine(if (trie.unique) "YES" else "NO")
}
bw.flush()
bw.close()
}
class Trie(val root: Node = Node(mutableMapOf(), false)) {
var unique = true
fun add(num: String) {
var currentNode = root
for (i in num) {
if (currentNode.terminal) unique = false
currentNode = currentNode.child.getOrPut(i.digitToInt()) { Node(mutableMapOf(), false) }
}
currentNode.terminal = true
if (currentNode.terminal && currentNode.child.isNotEmpty()) unique = false
}
}
트라이 알고리즘을 적용했다고 한다.
트라이 알고리즘은 문자열의 탐색을 할 때 시간복잡도에 있어서 하나씩 비교하는 것 보다 훨씬 효율적으로 빠르게 탐색할 수 있기 때문에 사용한다고 한다. 주로 검색어 자동완성, 사전 찾기, 문자열 검사 등에 사용된다.
https://youjourney.github.io/archivers/BOJ5052
https://twpower.github.io/187-trie-concept-and-basic-problem
'백준 > 문제' 카테고리의 다른 글
1202번: 보석 도둑 (1) | 2023.10.20 |
---|---|
11728번: 배열 합치기 (1) | 2023.10.19 |
1543번: 문서 검색 (0) | 2023.10.17 |
2667번: 단지번호붙이기 (0) | 2023.10.16 |
1373번: 2진수 8진수 (0) | 2023.10.13 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!