728x90
https://www.acmicpc.net/problem/12933
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
'Algorithm (PS)' 카테고리의 다른 글
백준 17406번: 배열 돌리기 4 (Python/파이썬) (0) | 2022.12.24 |
---|---|
[백준] 2098 외판원 순회 Swift (0) | 2022.12.17 |
[프로그래머스] 행렬의 곱셈 Swift - 구현/선형대수학 (0) | 2022.12.14 |
[백준] 1245번: 농장관리 Swift 풀이 (BFS/DFS) (1) | 2022.12.14 |
[백준] 10836번: 여왕벌 (파이썬/Python) - 시뮬레이션/구현/Greedy (0) | 2022.12.12 |