ν”„λ‘œκ·Έλž˜λ°/μ•Œκ³ λ¦¬μ¦˜ 풀이 Swift

[λ°±μ€€ 10987] λͺ¨μŒμ˜ 개수 (Swift)

λΉ„λΉ„ bibi 2023. 1. 26. 11:57

[λ°±μ€€ 10987] λͺ¨μŒμ˜ 개수 (Swift)

10987번: λͺ¨μŒμ˜ 개수

μž…λ ₯ λ¬Έμžμ—΄μ—μ„œ λͺ¨μŒ(a, e, i, o, u)의 갯수λ₯Ό μ„Έμ„œ 좜λ ₯ν•˜λŠ” λ‹¨μˆœν•œ λ¬Έμ œμ΄λ‹€.

풀이λ₯Ό μ–΄λ–»κ²Œ 할지 κ³ λ―Όν•˜λ‹€κ°€ 두 가지 방법을 생각해 λ³΄μ•˜λ‹€.

  1. λ¬Έμžμ—΄μ˜ 문자λ₯Ό 돌며 μ–΄λ–€ λ¬Έμžκ°€ a, e, i, o, u 쀑 ν•˜λ‚˜λΌλ„ 같은지 ν™•μΈν•˜κΈ° (== μ—°μ‚°μž ν™œμš©)
  2. a, e, i, o, u λ₯Ό 담은 λͺ¨μŒ 배열을 λ§Œλ“€κ³ , λ¬Έμžμ—΄μ˜ 문자λ₯Ό 돌며 μ–΄λ–€ λ¬Έμžκ°€ λͺ¨μŒ 배열에 ν¬ν•¨λ˜λŠ”μ§€ ν™•μΈν•˜κΈ° (contains(_:) ν™œμš©)

두 풀이λ₯Ό λͺ¨λ‘ μž‘μ„±ν–ˆκ³  λ‘˜ λ‹€ λͺ¨λ‘ 잘 ν’€λ Έλ‹€.

개인적으둜 의문이 μƒκ²Όλ˜ 뢀뢄은 두 ν’€μ΄μ˜ μ‹€ν–‰μ‹œκ°„μ΄ μ™„μ „νžˆ κ°™μ•˜λ‹€λŠ” 것이닀.

λ‚˜λŠ” λ‹Ήμ—°νžˆ 풀이1이 더 λΉ λ₯Ό 것이라 μ˜ˆμƒν•˜κ³  풀이1을 λ¨Όμ € μ‹œλ„ν•˜κ³ , λ§žμ€ κ±Έ ν™•μΈν•œ λ’€ 풀이2도 μ‹œλ„ν–ˆλŠ”λ° μ‹€ν–‰μ‹œκ°„μ΄ κ°™μ•„μ„œ λ†€λžλ‹€.

κ·Έλž˜μ„œ λ‘˜μ˜ μ‹€ν–‰μ‹œκ°„μ„ μžμ„Ένžˆ 탐ꡬ해 λ³΄μ•˜λ‹€.

풀이 1 (== μ—°μ‚°μž ν™œμš©)


let input = readLine()!
var answer = 0
for char in input {
    if char == "a" || char == "e" || char == "i" || char == "o" || char == "u" {
        answer += 1
    }
}
print(answer)

풀이1μ—μ„œ λ¬Έμžμ—΄μ˜ 길이가 k라면, 비ꡐ해야 ν•  λͺ¨μŒμ˜ κ°œμˆ˜λŠ” 5개이기 λ•Œλ¬Έμ— μ΅œμ•…μ˜ 경우 μ‹€ν–‰μ‹œκ°„μ€ k*5κ°€ λœλ‹€.

ν•˜μ§€λ§Œ λ‚΄κ°€ 풀이1이 더 λΉ λ₯Ό 거라고 μ˜ˆμƒν–ˆλ˜ μ΄μœ λŠ” contains(_:) 의 μ‹œκ°„λ³΅μž‘λ„κ°€ O(n) 이고, λ”°λΌμ„œ λ‹Ήμ—°νžˆ μ΄λ³΄λ‹€λŠ” == μ—°μ‚°μžκ°€ λΉ λ₯Ό 거라고 μƒκ°ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

풀이1μ—μ„œλŠ” == 연산을 || 둜 μ΄μ–΄μ„œ λ‹€μ„― 번 μ‚¬μš©ν•˜κΈ΄ ν•˜μ§€λ§Œ, || μ—°μ‚°μ˜ νŠΉμ„±μƒ 맨 μ™Όμͺ½λΆ€ν„° μ‹œν–‰ν•΄ ν•˜λ‚˜λΌλ„ true이면 전체 결과도 trueμ΄λ―€λ‘œ 더 이상 λΉ„κ΅ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 이걸 short-circuit evaluation 라고 ν•œλ‹€κ³  ν•œλ‹€. (μ°Έκ³  : Swift 곡식 λ¬Έμ„œ)

κ·Έλž˜μ„œ 쑰건문 (char == "a" || char == "e" || char == "i" || char == "o" || char == "u") 을 λκΉŒμ§€ ν™•μΈν•΄μ•Όν•˜λŠ” 경우만 μ•„λ‹ˆλΌλ©΄, k*5λ³΄λ‹€λŠ” λΉ λ₯Έ μ‹€ν–‰μ‹œκ°„μ„ κ°€μ§ˆ 것이라 μ˜ˆμƒν•  수 μžˆλ‹€.

풀이 2 (contains(_:) ν™œμš©)

let input = readLine()!
let aeiou: [Character] = ["a", "e", "i", "o", "u"]
var answer = 0
for char in input {
    if aeiou.contains(char) {
        answer += 1
    }
}
print(answer)

풀이2μ—μ„œ μ‚¬μš©ν•˜λŠ” contains(_:) 의 μ‹œκ°„λ³΅μž‘λ„κ°€ O(n) 이닀. μ΄λ•Œ n은 λ°°μ—΄μ˜ 길이이며, μ—¬κΈ°μ„œλŠ” aeiou 의 길이인 5κ°€ λœλ‹€.

λ¬Έμžμ—΄μ˜ 문자λ₯Ό 돌며 containsλ₯Ό μ μš©ν•˜κΈ° λ•Œλ¬Έμ—, λ¬Έμžμ—΄μ˜ 길이가 k일 λ•Œ μ‹€ν–‰μ‹œκ°„μ€ k * 5이닀.

이 λ•Œ λ‚΄κ°€ κ°„κ³Όν•œ 것은 contains의 λ™μž‘μ΄λ‹€.

κ³΅μ‹λ¬Έμ„œμ—λŠ” contains(_:) 의 μ‹œκ°„λ³΅μž‘λ„κ°€ O(n)이라고만 μ„€λͺ…λ˜μ–΄ μžˆλ‹€.

ν•˜μ§€λ§Œ contains μ—­μ‹œ λ°°μ—΄μ˜ μ•ž μš”μ†ŒλΆ€ν„° ν•˜λ‚˜μ”© λΉ„κ΅ν•˜λ―€λ‘œ, 탐색할 μš”μ†Œκ°€ μ•žμ— μžˆλŠ” 경우 n보닀 λΉ λ₯΄κ²Œ 결과값을 λ°˜ν™˜ν•œλ‹€.

λ‹¨μˆœν™”ν•΄ ν‘œν˜„ν•˜μžλ©΄ [0, 0, 0, 0, 1]μ—μ„œ contains(1)둜 1을 μ°ΎλŠ” 것보닀 [1, 0, 0, 0, 0]μ—μ„œ contains(1)둜 1을 μ°ΎλŠ” 것이 더 λΉ λ₯΄λ‹€λŠ” 것이닀. μ°ΎλŠ” μš”μ†Œκ°€ 맨 μ•žμ— 있기 λ•Œλ¬Έμ΄λ‹€.

(μžμ„Έν•œ λ‚΄μš©μ€ contains(_:) λ¬Έμ„œμ™€ ν•¨κ»˜ ν•΄μ„ν•œ 이 글에 μ„€λͺ…λ˜μ–΄ μžˆλ‹€)

κ²°λ‘ 

== λ₯Ό μ‚¬μš©ν•˜λŠ” 풀이1은, μ΅œμ•…μ˜ 경우 쑰건문 (char == "a" || char == "e" || char == "i" || char == "o" || char == "u") 을 μ „λΆ€ 비ꡐ해야 ν•˜μ§€λ§Œ, μ•žμ˜ 쑰건문이 ν•˜λ‚˜λΌλ„ true인 경우 short-circuit evaluation에 μ˜ν•΄ λ‚˜λ¨Έμ§€ 쑰건문은 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

contains(_:)λ₯Ό μ‚¬μš©ν•˜λŠ” 풀이2 μ—­μ‹œ, μ΅œμ•…μ˜ 경우 λͺ¨μŒ λ°°μ—΄μ˜ λκΉŒμ§€ μš”μ†Œκ°€ ν¬ν•¨λ˜λŠ”μ§€ 비ꡐ해야 ν•˜μ§€λ§Œ, μ°ΎλŠ” μš”μ†Œκ°€ μ•žμͺ½μ— μžˆλŠ” 경우 λ‚˜λ¨Έμ§€ 비ꡐλ₯Ό λ©ˆμΆ”κ³  μ¦‰μ‹œ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 쑰건문 비ꡐ μˆœμ„œ(char == "a" || char == "e" || char == "i" || char == "o" || char == "u") 와 containsλ₯Ό ν™•μΈν•˜λŠ” λ°°μ—΄μ˜ μš”μ†Œ μˆœμ„œ(["a", "e", "i", "o", "u"])κ°€ 같은 ν•œ λ‘˜μ€ λ™μΌν•œ μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§€λŠ” 것이닀!