Algorithm (PS)
[백준] 12933번 : 오리 Swift 풀이 - 구현
minjiwoo
2022. 12. 16. 15:37
728x90
https://www.acmicpc.net/problem/12933
12933번: 오리
첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다.
www.acmicpc.net
Swift로 풀때 문자열을 for문으로 순회해서 하나씩 값을 확인할 때, Array로 만들고 숫자 인덱스로 접근할 수 있게 하는것이 훨씬 편하다 라는 것을 배운 문제이다
var word = "hello" 라는 문자열을 "h", "e", "l", "l", "o" 이렇게 접근하고 싶다면
var idx = input.index(input.startIndex, offsetBy: i)
이렇게 index로 꺼내고 word[index] 이런식으로 접근해야 하는데...!! 저 input.index() 함수가 시간을 많이 잡아먹는것 같다
최악의 경우 시간복잡도는 O(input.self.count)로, 즉 O(N) 인 것이다
그래서 Array(word) 로 만들어주어서 String을 배열로 만든후 Int로 인덱스에 접근하는 방법으로 바꾸었더니, 시간초과를 피할 수 있었다 -> O(N)에서 O(1)로 줄인게 큰 것 같다
import Foundation
var input = Array(readLine()!) // 문자열 하나 입력받기
var answer = 0
var flag = true
let n = input.count
var visited = Array(repeating: 0, count: n)
var target = ["q", "u", "a", "c", "k"]
var t = 0
if n%5 != 0 {
flag = false
print(-1)
exit(0)
}
func solve(start: Int) -> Bool {
var check = false
for i in start..<n {
// var idx = input.index(input.startIndex, offsetBy: i)
var x = String(input[i])
if x == target[t] && visited[i] == 0 {
t += 1
visited[i] = 1
}
if t == 5 {
check = true
t = 0
}
}
return check
}
for i in 0..<n {
// var idx = input.index(input.startIndex, offsetBy: i)
if String(input[i]) == "q" && visited[i] == 0 {
if solve(start: i) == true {
answer += 1
}
}
}
for i in 0..<n {
if visited[i] == 0 {
flag = false
break
}
}
// 정답 출력
if answer > 0 && flag == true {
print(answer)
} else {
print(-1)
}
Swift 코딩테스트용 (?) 문법이 생소하지만, 그래도 속도가 Python에 비해서 훨씬 빨라서 좋다 ㅋㅋㅋㅋㅋ
728x90