[백준] 사이클 단어 (1544)
문제 설명
입력 및 출력
» 입력
첫째 줄에 단어의 개수 N이 주어진다. 둘째 줄부터 단어가 한 줄에 하나씩 주어진다. 단어는 영어 소문자로만 이루어져 있다. N은 50보다 작거나 같은 자연수이며, 단어의 길이는 최대 50이다.
» 출력
첫째 줄에 서로 다른 단어가 몇 개인지 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
5 picture turepic icturep word ordw |
2 |
문제 풀이 (KOTLIN)
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
val mSet = mutableSetOf<String>()
val N = readLine().toInt()
when (N) {
0, 1 -> println(N) // N의 입력 범위는 50과 같거나 작은 자연수(0 <= N <= 50)
else -> { // N이 2 <= N <= 50일 경우
repeat(N) { n ->
if (n == 0) { // 처음 입력 받는 단어의 경우, 비교 대상이 없으므로 바로 1개 카운트
val tmp = readLine()
mSet.add(tmp)
// println("새로운 단어 : $tmp")
} else {
val str = readLine() // 비교할 단어를 입력 받음
val strLength = str.length // 비교할 단어의 길이를 저장
var isNew = true // 기존 단어인지를 체크할 변수
// 기존 단어들 중 비교할 단어와 길이가 같은 경우, 같은 단어일 수 있으므로 확인이 필요함
// 기존 단어들과 비교할 단어의 같이가 같은 경우가 없는 경우, 전혀 다른 단어임
if (mSet.map { it.length }.contains(strLength)) {
for (i in 0 until strLength) {
// (단어[i] ~ 단어[단어길이]) + (단어[0] ~ 단어[0])
// e.g. rdwo ->
// when i == 0 -> "rdwo" + "" == "rdwo"
// when i == 2 -> "wo" + "rd" == "word"
val tmp = str.substring(i until strLength) + str.substring(0 until i)
// 기존 단어에 해당할 경우, 기존 단어 체크 변수(isNew)를 false 후 break
if (mSet.contains(tmp)) {
// println("기존 단어 : $tmp")
isNew = false
break
}
}
}
// 위 for문에서 체크한 단어가 새로운 것일 경우, mSet에 단어 추가
if (isNew) {
// println("새로운 단어 : $str")
mSet.add(str)
}
}
}
// 모든 단어 N개를 체크한 후 mSet에 저장된 중복되지 않은 단어의 개수를 출
println(mSet.size)
}
}
}
문제 풀이 (SWIFT)
// "bca"가 "abc"의 사이클 단어임을 확인하기 위해
// "abc" + "abc" 즉, "abcabc"에서 "bca"를 찾을 수 있는지 확인
import Foundation
func isCycle(newStr: String) -> Bool {
for str in list {
if str.count == newStr.count && String(str + str).range(of: newStr) != nil {
return true
}
}
return false
}
var list = [String]()
for _ in 0..<Int(readLine()!)! {
let newStr = readLine()!
if !isCycle(newStr: newStr) {
list.append(newStr)
}
}
print(list.count)