๐ ์ฝ๋ฉํ ์คํธ
โ๐ป Github
๋ฌธ์ ์ค๋ช
๋จธ์ฑ์ด๋ ํ์ด๋ ์ง 11๊ฐ์ ๋ ์กฐ์นด๋ฅผ ๋๋ณด๊ณ ์์ต๋๋ค. ์กฐ์นด๋ ์์ง "aya", "ye", "woo", "ma" ๋ค ๊ฐ์ง ๋ฐ์๊ณผ ๋ค ๊ฐ์ง ๋ฐ์์ ์กฐํฉํด์ ๋ง๋ค ์ ์๋ ๋ฐ์๋ฐ์ ํ์ง ๋ชปํ๊ณ ์ฐ์ํด์ ๊ฐ์ ๋ฐ์์ ํ๋ ๊ฒ์ ์ด๋ ค์ํฉ๋๋ค. ๋ฌธ์์ด ๋ฐฐ์ด babbling์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋จธ์ฑ์ด์ ์กฐ์นด๊ฐ ๋ฐ์ํ ์ ์๋ ๋จ์ด์ ๊ฐ์๋ฅผ returnํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- 1 ≤ babbling์ ๊ธธ์ด ≤ 100
- 1 ≤ babbling[i]์ ๊ธธ์ด ≤ 30
- ๋ฌธ์์ด์ ์ํ๋ฒณ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
babbling result
babbling | result |
["aya", "yee", "u", "maa"] | 1 |
["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"] | 2 |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
- ["aya", "yee", "u", "maa"]์์ ๋ฐ์ํ ์ ์๋ ๊ฒ์ "aya"๋ฟ์ ๋๋ค. ๋ฐ๋ผ์ 1์ returnํฉ๋๋ค.
์ ์ถ๋ ฅ ์ #2
- ["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]์์ ๋ฐ์ํ ์ ์๋ ๊ฒ์ "aya" + "ye" = "ayaye", "ye" + "ma" + "woo" = "yemawoo"๋ก 2๊ฐ์ ๋๋ค. "yeye"๋ ๊ฐ์ ๋ฐ์์ด ์ฐ์๋๋ฏ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ 2๋ฅผ returnํฉ๋๋ค.
์ ์์ฌํญ
- ๋ค ๊ฐ์ง๋ฅผ ๋ถ์ฌ ๋ง๋ค ์ ์๋ ๋ฐ์ ์ด์ธ์๋ ์ด๋ค ๋ฐ์๋ ํ ์ ์๋ ๊ฒ์ผ๋ก ๊ท์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด "woowo"๋ "woo"๋ ๋ฐ์ํ ์ ์์ง๋ง "wo"๋ฅผ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ํ ์ ์๋ ๋ฐ์์ ๋๋ค.
๋ฌธ์ ํ์ด
๋์ ํ์ด
import Foundation
func solution(_ babbling:[String]) -> Int {
// ์๊ธฐ๊ฐ ์กฐํฉํ ์ ์๋ ์น์์ด์ ๊ฐ์
var count = 0
// ์๊ธฐ๊ฐ ํ ์ ์๋ ์น์์ด
let word = [ "aya", "ye", "woo", "ma"]
for bab in babbling {
var bab = bab
// ๋ฐ๋ณต๋๋ ๋ฌธ์์ด์ ์ฐพ๊ธฐ์ํ ๋ฌธ์์ด ์ ์ฅ
var pre: String = ""
while true {
if bab.count < 2 {
break
}else if bab.count == 2 {
let bab2 = String(bab.prefix(2))
if word.contains(bab2) && bab2 != pre {
pre = bab2
bab.removeFirst(2)
}else {
break
}
}else {
let bab2 = String(bab.prefix(2))
let bab3 = String(bab.prefix(3))
if word.contains(bab2) && bab2 != pre {
pre = bab2
bab.removeFirst(2)
}else if word.contains(bab3) && bab3 != pre {
pre = bab3
bab.removeFirst(3)
}else {
break
}
}
if bab == "" {
count += 1
break
}
}
}
return count
}
์ฐ์ ์ ์ผ๋ก ๋ ๊ฐ์ง์ ์ง์คํด์ ํ์๋ค.
- ๋ฌธ์์ด์ด ๋ฐ๋ณต์ด ๋๋ฉด ๋ฌธ์์ด ๋น๊ต ์ข ๋ฃ
- ๋ฌธ์์ด ๊ฐ์์ ๋ฐ๋ฅธ ์ถ๋ ฅ
์๊ธฐ๊ฐ ๋ผ ์ ์๋ babbling์ด 4๊ฐ์ง ๋ฐ์ ๋์ง ์๊ณ ์๋ฆฌ์ ๊ฐ์๊ฐ 2๊ฐ ์๋๋ฉด 3๊ฐ์ด๋ค.
์ด๋ฅผ ์ด์ฉํด babbling์ ์์ 2๊ฐ๋ 3๊ฐ์ ๋ฌธ์๋ฅผ ๊บผ๋ด์ ( prefix ์ฌ์ฉ )
์๊ธฐ๊ฐ ๋ผ ์ ์๋ babbling์ ํฌํจ์ด ๋๊ฑฐ๋ ์ค๋ณต์ด ๋์ง ์๋๋ค๋ฉด ํด๋น ๋ฌธ์๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ๋ฐ๋ณต๋ฌธ์ ๋๋๋ก ํ์๋ค.
์ฌ๊ธฐ์ ๋ฌธ์์ด์ด 3๊ฐ ์ด์์ด๋ฉด, prefix(2), prefix(3)์ ๋ชจ๋ ๋ฐํํ์ฌ ๋น๊ตํ ์ ์๋๋ฐ
๋ฌธ์์ด์ด 2๊ฐ ์ด์์ด๋ฉด, prefix(3)์ ๋ฐํํ ์ ์์ด์ ์๋ฌ๊ฐ ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ฐ๋ก ํจ์๋ฅผ ๋ง๋ค๋ ค๋ค ์กฐ๊ฑด๋ฌธ์ผ๋ก ๊ตฌ์ฑ์ ํ๋ค.
๋ฌธ์์ด์ด 2๊ฐ๋ณด๋ค ์๋ค๋ฉด ๋ฐ๋ณต๋ฌธ ์ข ๋ฃ
๋ฌธ์์ด์ ๊ธธ์ด๊ฐ 2๊ฐ๋ผ๋ฉด prefix(2)๋ก ๋น๊ต
๋ฌธ์์ด์ ๊ธธ์ด๊ฐ 3๊ฐ๋ผ๋ฉด prefix(3)๊ณผ prefix(2) ๋๋ค ๋น๊ต
์คํํ์์ ๋์ ์๊ฐ์ด๋ค.
ํ
์คํธ 1 ใ ํต๊ณผ (0.07ms, 16.4MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.06ms, 16.4MB)
ํ
์คํธ 3 ใ ํต๊ณผ (0.09ms, 15.8MB)
ํ
์คํธ 4 ใ ํต๊ณผ (0.06ms, 16MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.05ms, 16.2MB)
ํ
์คํธ 6 ใ ํต๊ณผ (0.05ms, 16.4MB)
ํ
์คํธ 7 ใ ํต๊ณผ (0.04ms, 16.5MB)
ํ
์คํธ 8 ใ ํต๊ณผ (0.07ms, 16.1MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.07ms, 16.3MB)
ํ
์คํธ 10 ใ ํต๊ณผ (0.05ms, 16.2MB)
ํ
์คํธ 11 ใ ํต๊ณผ (0.10ms, 16MB)
ํ
์คํธ 12 ใ ํต๊ณผ (0.47ms, 16.2MB)
ํ
์คํธ 13 ใ ํต๊ณผ (0.49ms, 16.2MB)
ํ
์คํธ 14 ใ ํต๊ณผ (0.53ms, 16.1MB)
ํ
์คํธ 15 ใ ํต๊ณผ (0.27ms, 16.4MB)
ํ
์คํธ 16 ใ ํต๊ณผ (0.24ms, 16.2MB)
ํ
์คํธ 17 ใ ํต๊ณผ (0.84ms, 16.5MB)
ํ
์คํธ 18 ใ ํต๊ณผ (0.34ms, 16.2MB)
ํ
์คํธ 19 ใ ํต๊ณผ (0.07ms, 16.1MB)
ํ
์คํธ 20 ใ ํต๊ณผ (0.16ms, 16.4MB)
์ฌ๋ฌ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ฝ๋๊ฐ ๋ณต์กํ๊ฒ ์ง์ฌ์ง๊ฑฐ ๊ฐ์ ์ ๋ฆฌ๋ฅผ ํ๊ณ ์ถ์์ง๋ง ๋ถ๊ฐ๋ฅ.. ใ
๊ทธ๋๋ ์ต๋ํ ์๊ฐ์ ๋ ์ฐ๊ธฐ ์ํด์ ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋๊ฐ ์ ์๋ ์กฐ๊ฑด์ ๋ง์ด ๋ง๋ค์ด๋์๋ค.
๋ค๋ฅธ ์ฌ๋ ํ์ด
์ฒซ๋ฒ์งธ,
import Foundation
func solution(_ babbling:[String]) -> Int {
var count: Int = 0
for element in babbling {
var str = String(element)
str = str.replacingOccurrences(of: "aya", with: "1")
str = str.replacingOccurrences(of: "ye", with: "2")
str = str.replacingOccurrences(of: "woo", with: "3")
str = str.replacingOccurrences(of: "ma", with: "4")
if Int(str) != nil && !str.contains("11") && !str.contains("22") && !str.contains("33") && !str.contains("44"){
count += 1
}
}
return count
}
์ด ๋ถ์ ํ์ด๋ replacingOccurrences๋ฅผ ์ด์ฉํ์๋ค.
๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ์ง ์๊ณ ํฌํจ์ด ๋์ด์๋ ๋ฌธ์์ด์ ํ๋ฒ์ ๋ฐ๊ฟ ์ ์์ด ์ข์ ์ฝ๋์ธ๊ฒ ๊ฐ๊ณ ,
' ๋ฌธ์์ด ๋์ฒด๋ replacingOccurrences '์ธ๋ฐ ์ ์๊ฐํด๋ด์ง ๋ชปํ๋ ๋ผ๋ ์๊ธฐ ๋ฐ์ฑ๋ ํ๊ฒ ๋๋ค.
์ด ๋ถ์ ๋ฐ๋ณต๋ฌธ์์ด์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก if๋ฌธ์ ์กฐ๊ฑด์ ๋์ดํ์๋๋ฐ, ์ด ๋ถ๋ถ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
๋ค๋ง ์๊ฐ์ ๋ดค์ ๋,
ํ
์คํธ 1 ใ ํต๊ณผ (0.45ms, 16.4MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.27ms, 16.4MB)
ํ
์คํธ 3 ใ ํต๊ณผ (0.42ms, 16.4MB)
ํ
์คํธ 4 ใ ํต๊ณผ (0.32ms, 16.3MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.27ms, 16.6MB)
ํ
์คํธ 6 ใ ํต๊ณผ (0.26ms, 16.3MB)
ํ
์คํธ 7 ใ ํต๊ณผ (0.38ms, 16.3MB)
ํ
์คํธ 8 ใ ํต๊ณผ (0.38ms, 16.5MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.48ms, 16.4MB)
ํ
์คํธ 10 ใ ํต๊ณผ (0.31ms, 16.3MB)
ํ
์คํธ 11 ใ ํต๊ณผ (0.57ms, 16.3MB)
ํ
์คํธ 12 ใ ํต๊ณผ (1.90ms, 16.6MB)
ํ
์คํธ 13 ใ ํต๊ณผ (2.08ms, 16.6MB)
ํ
์คํธ 14 ใ ํต๊ณผ (1.79ms, 16.4MB)
ํ
์คํธ 15 ใ ํต๊ณผ (3.33ms, 16.4MB)
ํ
์คํธ 16 ใ ํต๊ณผ (2.13ms, 16.5MB)
ํ
์คํธ 17 ใ ํต๊ณผ (2.69ms, 16.5MB)
ํ
์คํธ 18 ใ ํต๊ณผ (3.69ms, 16.6MB)
ํ
์คํธ 19 ใ ํต๊ณผ (0.82ms, 16.5MB)
ํ
์คํธ 20 ใ ํต๊ณผ (1.52ms, 16.4MB)
replacingOccurences์ ์๊ฐ ๋ณต์ก๋๊ฐ O(n)์ด๋ฏ๋ก
๋๋ต์ ์ผ๋ก ๋ฐฐ์ด ํ๋๋น ์๊ฐ๋ณต์ก๋์ ์ต๋๊ฐ O(n) * 4 ์ผ ๊ฒ์ด๋ค. ( n์ ๋ฌธ์์ด ๊ธธ์ด )
์ฌ๊ธฐ์ babbling์ ๋ฐฐ์ด์ ๊ฐ์ ๋งํผ ๋ฐ๋ณต์ด ๋๋
- 1 ≤ babbling์ ๊ธธ์ด ≤ 100
- 1 ≤ babbling[i]์ ๊ธธ์ด ≤ 30
์ด ๋ถ๋ถ์ ํ์ธํ์ ๋, ์ด๋ถ์ ์๊ฐ๋ณต์ก๋์ ์ต๋๊ฐ์ 100 * ( O(30) * 4 ) ์ด๋ค.
์ด ๋ฌธ์ ์์๋ ๋ฌธ์์ด์ ๋์ฒดํ์ฌ ํธ๋ ๋ฐฉ๋ฒ์ด ์๊ฐ์ ์ผ๋ก๋ ํจ์จ์ ์ด์ง ๋ชปํ ๊ฒ ๊ฐ๋ค.
๋ ๋ฒ์งธ,
import Foundation
func solution(_ babbling:[String]) -> Int {
let strArr = ["aya", "ye", "woo", "ma"]
var answer = 0
func checkWord(_ str: String) -> Bool {
var b = str
for s in strArr {
b = b.replacingOccurrences(of: s, with: "-")
if b.contains("--") { return false }
b = b.replacingOccurrences(of: "-", with: " ")
}
return b.replacingOccurrences(of: " ", with: "").isEmpty
}
for babble in babbling {
if checkWord(babble) {
answer += 1
}
}
return answer
}
์ด ๋ถ์ ์์ ๋ถ๊ณผ ๋์ผํ๊ฒ replacingOccurrences๋ฅผ ์ฌ์ฉํ์์ง๋ง,
๋ฐ๋ณต๋ฌธ์ ๋ ๋ฒ ๋๋ฆฌ๋ฉด์ ๋ฐ๋ณต๋๋ ๋ฌธ์์ด์ด ๋์ค๋ ์ฆ์ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๋๋ก ํ์๋ค.
๋ค๋ง, ๋ฌธ์์ด์ด ๋ฐ๋ณต์ด ๋๋ค๋ฉด ๋ฌธ์์ด ์ข ๋ฃ๊ฐ ๋๋ค๋ ๊ฒ ์์ผ๋ ๋ฌธ์์ด์ ๋น๊ตํ๋ ๊ณผ์ ์์ -๋ก ๋ฐ๊พธ๊ณ ๋ฐ๋ณต์ด ๋์ง ์๋๋ค๋ฉด ๋ค์ “ “๋ก ๋ฐ๊พธ๋ ๋ถ๋ถ์ด ํ์์น ์๊ฒ replacingOccurences์ ํจ์๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ์๋ค.
ํ
์คํธ 1 ใ ํต๊ณผ (0.31ms, 16.5MB)
ํ
์คํธ 2 ใ ํต๊ณผ (0.37ms, 16.2MB)
ํ
์คํธ 3 ใ ํต๊ณผ (0.40ms, 16.4MB)
ํ
์คํธ 4 ใ ํต๊ณผ (0.25ms, 16.2MB)
ํ
์คํธ 5 ใ ํต๊ณผ (0.29ms, 16.3MB)
ํ
์คํธ 6 ใ ํต๊ณผ (0.27ms, 16.5MB)
ํ
์คํธ 7 ใ ํต๊ณผ (0.25ms, 16.5MB)
ํ
์คํธ 8 ใ ํต๊ณผ (0.28ms, 16.5MB)
ํ
์คํธ 9 ใ ํต๊ณผ (0.46ms, 16.5MB)
ํ
์คํธ 10 ใ ํต๊ณผ (0.48ms, 16.4MB)
ํ
์คํธ 11 ใ ํต๊ณผ (0.50ms, 16.4MB)
ํ
์คํธ 12 ใ ํต๊ณผ (2.46ms, 16.5MB)
ํ
์คํธ 13 ใ ํต๊ณผ (6.67ms, 16.4MB)
ํ
์คํธ 14 ใ ํต๊ณผ (3.50ms, 16.6MB)
ํ
์คํธ 15 ใ ํต๊ณผ (2.53ms, 16.4MB)
ํ
์คํธ 16 ใ ํต๊ณผ (7.09ms, 16.6MB)
ํ
์คํธ 17 ใ ํต๊ณผ (4.47ms, 16.6MB)
ํ
์คํธ 18 ใ ํต๊ณผ (4.78ms, 16.5MB)
ํ
์คํธ 19 ใ ํต๊ณผ (1.11ms, 16.3MB)
ํ
์คํธ 20 ใ ํต๊ณผ (2.24ms, 16.4MB)
์ธ ๋ฒ์งธ,
func solution(_ babbling: [String]) -> Int {
return babbling.filter { $0.range(of: "^(aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma))+$", options: .regularExpression) != nil }.count
}
์ฌ์ค ์ด ๋ถ๊บผ๋ ์ฝ๋ ๋ฆฌ๋ทฐ๊ฐ ํ๊ธฐ ์ซ์์ง๋ง, ์๊ฐ์ด ๊ถ๊ธํ๊ธฐ ๋๋ฌธ์ ํด๋ณด๋ ค๊ณ ํ๋ค.
( ์ ์ฝ๋์ babbling ๋์ ์ OO์๋ฆฌ๋ผ๊ณ ์์ด ์ ํ์์์.. ์ธ์ฑ.. )
regularExpression์ด๋ผ๋ ์ ๊ทํํ์์ ์ฌ์ฉํ์ฌ ํธ์ จ๋ค.
์ฌ์ค ์๊ฐ์ด ์ ค ์ ๊ฒ ๊ฑธ๋ฆด ์ค ์์๋๋ฐ ์๊ฐ๋ณด๋ค ๋ง์ด ๋์์ ๋๋ฌ๋ค.
ํ
์คํธ 1 ใ ํต๊ณผ (1.76ms, 17.9MB)
ํ
์คํธ 2 ใ ํต๊ณผ (1.91ms, 17.8MB)
ํ
์คํธ 3 ใ ํต๊ณผ (1.95ms, 17.6MB)
ํ
์คํธ 4 ใ ํต๊ณผ (1.86ms, 17.8MB)
ํ
์คํธ 5 ใ ํต๊ณผ (1.82ms, 17.7MB)
ํ
์คํธ 6 ใ ํต๊ณผ (2.73ms, 17.9MB)
ํ
์คํธ 7 ใ ํต๊ณผ (1.85ms, 17.7MB)
ํ
์คํธ 8 ใ ํต๊ณผ (1.70ms, 17.7MB)
ํ
์คํธ 9 ใ ํต๊ณผ (1.76ms, 17.6MB)
ํ
์คํธ 10 ใ ํต๊ณผ (1.88ms, 17.8MB)
ํ
์คํธ 11 ใ ํต๊ณผ (1.87ms, 17.6MB)
ํ
์คํธ 12 ใ ํต๊ณผ (2.41ms, 17.6MB)
ํ
์คํธ 13 ใ ํต๊ณผ (2.42ms, 17.7MB)
ํ
์คํธ 14 ใ ํต๊ณผ (2.46ms, 17.9MB)
ํ
์คํธ 15 ใ ํต๊ณผ (3.64ms, 17.6MB)
ํ
์คํธ 16 ใ ํต๊ณผ (2.39ms, 18MB)
ํ
์คํธ 17 ใ ํต๊ณผ (2.54ms, 17.6MB)
ํ
์คํธ 18 ใ ํต๊ณผ (3.59ms, 17.8MB)
ํ
์คํธ 19 ใ ํต๊ณผ (1.95ms, 18.1MB)
ํ
์คํธ 20 ใ ํต๊ณผ (2.22ms, 18.1MB)
๊ธธ์ด๊ฐ ์งง์ ์ผ์ด์ค ๋ค์์ ์๋๊ฐ ๋ง์ด ๊ฑธ๋ฆฌ์๊ณ , ์ ๊ทํํ์์ ์ฌ์ฉํด์ ๊ทธ๋ฐ์ง ๋๋ถ๋ถ์ ์ผ์ด์ค์ ์๊ฐ์ด ๋น์ทํ๊ฒ ๊ฑธ๋ ธ๋ค.
์ ๊ทํํ์์ ํจํด์ ๋ํ ํฌ์คํ ๋ ํ๋ ์ฌ๋ ค์ผ๊ฒ ๋ค.
์ค์ํ ๊ฐ๋
- replacingOccurences์ ์๊ฐ๋ณต์ก๋๋ O(n)