문제가 이해안가서 이해하려고 쓰는 포스팅..

처음에 윗 예시처럼 quack / quack이라 두마리인줄 알았는데 알고보니 연속된 quack은 한마리였던거임!!
그리고 울음소리를 전부 사용해야 한다는 부분이 좀 헷갈렸다.
그래서 우선 정상적인 울음소리가 아닌 경우
- q로 시작하지 않거나
- k로 끝나지 않거나
- 울음소리 전체가 5로 나누어떨어지지 않으면
-1을 출력해주었다.duckSound[0] != "q" || duckSound[soundCnt-1] != "k" || soundCnt % 5 != 0

울음 소리의 수는 맞지만 윗 예시처럼 이상한 울음소리를
거르기 위해 아래와 같은 조건 추가if duckSound[i] == "q" && visited[i] == 0 { getDuckCnt(i) }
여기서는 quack 배열을 만들고, quack 전용 idx를 만들어서 울음소리와 quack을 하나씩 비교하고 방문 처리
새로운 오리인지 아닌지 확인해주는 변수를 추가
만약에 새로운 오리라면 duckCnt += 1해주고
isNewDuck = false 바꿔주면서
k 다음 q가 오는 한마리의 오리가 우는 상황을 대비
func getDuckCnt(_ start: Int) {
var idx = 0 //quack용 index
var isNewDuck = true //새로운 오리인지 아닌지
for i in start..<soundCnt {
if duckSound[i] == quack[idx] && visited[i] == 0 {
idx += 1
visited[i] = 1
if duckSound[i] == "k" {
idx = 0
if isNewDuck {
duckCnt += 1
isNewDuck = false
}
}
}
}
}
오리의 수가 0이거나 방문하지 않은 울음소리가 있다면
이 또한 정상적인 울음소리가 아니기 때문에 -1if duckCnt == 0 || visited.contains(0) { print(-1) } else { print(duckCnt) }
func getDuckCnt(_ start: Int) {
var idx = 0 //quack용 index
var isNewDuck = true //새로운 오리인지 아닌지
for i in start..<soundCnt {
if duckSound[i] == quack[idx] && visited[i] == 0 {
idx += 1
visited[i] = 1
if duckSound[i] == "k" {
idx = 0
if isNewDuck {
duckCnt += 1
isNewDuck = false
}
}
}
}
}
let duckSound = readLine()!.map { String($0) }
let soundCnt = duckSound.count
var visited = Array(repeating: 0, count: soundCnt)
let quack = ["q", "u", "a", "c", "k"]
var duckCnt = 0 // 출력해야 할 오리 수
if duckSound[0] != "q" || duckSound[soundCnt-1] != "k" || soundCnt % 5 != 0 {
print(-1)
} else {
for i in 0..<soundCnt {
if duckSound[i] == "q" && visited[i] == 0 {
getDuckCnt(i)
}
}
if duckCnt == 0 || visited.contains(0) {
print(-1)
} else {
print(duckCnt)
}
}