[백준] 사이클 단어 (1544)

문제 설명

백준 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)

태그:

카테고리:

업데이트: