Coding Test/BOJ

[BOJ] 10808번 - μ•ŒνŒŒλ²³ 개수 (Swift)

Horang🐯 2024. 2. 13. 00:11

문제

μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œλ§Œ 이루어진 단어 Sκ°€ μ£Όμ–΄μ§„λ‹€. 각 μ•ŒνŒŒλ²³μ΄ 단어에 λͺ‡ κ°œκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

<문제 링크>

 

10808번: μ•ŒνŒŒλ²³ 개수

단어에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” a의 개수, b의 개수, …, z의 개수λ₯Ό 곡백으둜 κ΅¬λΆ„ν•΄μ„œ 좜λ ₯ν•œλ‹€.

www.acmicpc.net


μž…λ ₯

첫째 쀄에 단어 Sκ°€ μ£Όμ–΄μ§„λ‹€. λ‹¨μ–΄μ˜ κΈΈμ΄λŠ” 100을 λ„˜μ§€ μ•ŠμœΌλ©°, μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œλ§Œ 이루어져 μžˆλ‹€.


좜λ ₯

단어에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” a의 개수, b의 개수, …, z의 개수λ₯Ό 곡백으둜 κ΅¬λΆ„ν•΄μ„œ 좜λ ₯ν•œλ‹€.


문제 풀이

μž…λ ₯된 λ¬Έμžμ—΄μ„ μˆœνšŒν•˜λ©° ν•΄λ‹Ήν•˜λŠ” μ•ŒνŒŒλ²³ μˆœμ„œμ— ν•΄λ‹Ήν•˜λŠ” μΈλ±μŠ€μ— +1을 ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

ν•΄λ‹Ή ν’€μ΄λŠ” 이쀑 for문을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— O(n^2) μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, λ°°μ—΄μ˜ μΈλ±μŠ€μ™€ ν•΄λ‹Ή μ•ŒνŒŒλ²³ 문자의 μ•„μŠ€ν‚€ μ½”λ“œλ₯Ό μ΄μš©ν•œλ‹€λ©΄ O(n) μ‹œκ°„ λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.

(사싀, μ €λŠ” 처음 문제λ₯Ό ν’€μ—ˆμ„ λ•Œ 이쀑 for문으둜 ν’€μ—ˆμ–΄μš” ..γ…Ž)

 

각 λ¬ΈμžλŠ” κ³ μœ ν•œ μ•„μŠ€ν‚€ μ½”λ“œλ₯Ό κ°–κ³  있으며, μ—°μ†λœ μ•ŒνŒŒλ²³λ“€μ€ μ—°μ†λœ μ•„μŠ€ν‚€ μ½”λ“œ 값을 κ°–μŠ΅λ‹ˆλ‹€.

 

즉, 'a'λŠ” μ•„μŠ€ν‚€ μ½”λ“œλ₯Ό 10μ§„μˆ˜λ‘œ ν‘œμ‹œν•˜λ©΄ 97, 'b'λŠ” 98, 'c'λŠ” 99 ... 순차적으둜 μ΄μ–΄μ§‘λ‹ˆλ‹€.

(μΆ”κ°€λ‘œ 'A'λŠ” 65, 'B'λŠ” 66 ... 순차적으둜 μ•„μŠ€ν‚€ μ½”λ“œ 값을 κ°–μŠ΅λ‹ˆλ‹€.) 

 

 이 λ¬Έμ œμ—μ„œλŠ” μž…λ ₯이 μ†Œλ¬Έμžλ‘œ μ œν•œλ˜μ–΄ μžˆμœΌλ―€λ‘œ ν•΄λ‹Ή 사싀을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

풀이 μˆœμ„œ

1. 좜λ ₯ 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄ μ•ŒνŒŒλ²³ 개수만큼의 μš”μ†Œλ₯Ό κ°–λŠ” 배열을 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

2. μž…λ ₯κ°’μœΌλ‘œ 받은 λ¬Έμžμ—΄λ‘œ μˆœνšŒν•˜λ©° 각 문자의 μ•„μŠ€ν‚€ μ½”λ“œ 값을 ν™•μΈν•©λ‹ˆλ‹€.

3. ν•΄λ‹Ή 값을 'a'의 μ•„μŠ€ν‚€ μ½”λ“œ 값인 97둜 λΉΌμ£Όκ³ , ν•΄λ‹Ή 값을 λ°°μ—΄μ˜ 인덱슀둜 ν™œμš©ν•˜μ—¬ ν•΄λ‹Ή μ•ŒνŒŒλ²³ μžλ¦¬μ— +1을 ν•΄μ€λ‹ˆλ‹€.


풀이 μ½”λ“œ

< 풀이 1 - 이쀑 forλ¬Έ ν™œμš© >

 // 이쀑 forλ¬Έ μ‚¬μš© 풀이 
 // O(n^2)

var input = readLine()

if let input = input {
    var answer = [Int](repeating: 0, count: 26)
    var alphabets = "abcdefghijklmnopqrstuvwxyz"
    var index = 0

    for str in input {

        for alphabet in alphabets {
            if str == alphabet {
                answer[index] += 1

                index = 0
                break
            } else {
                index += 1
            }
        }
    }

    print(answer.map { String($0) }.joined(separator:" ") )
}

< 풀이 2 - μ•„μŠ€ν‚€ μ½”λ“œ ν™œμš© >

문자 'a'의 μ•„μŠ€ν‚€ μ½”λ“œκ°€ 97인 것을 μ•Œκ³  μžˆλ‹€λ©΄ 97을 직접 λŒ€μž…ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ§€λ§Œ,

λͺ¨λ₯Ό κ²½μš°μ—λŠ” μ•„λž˜μ™€ 같이 직접 ν™•μΈν•˜μ—¬ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

(Swiftμ—μ„œ μ•„μŠ€ν‚€ μ½”λ“œλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ unicodeScalars, utf8, asciiValue 등을 ν™œμš©ν•  수 μžˆμ§€λ§Œ,
각 λ°©μ‹λ§ˆλ‹€ λ¦¬ν„΄λ˜λŠ” νƒ€μž…μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ£Όμ˜ν•΄μ•Όν•©λ‹ˆλ‹€. μ΄λŠ” λ‚˜μ€‘μ— Swift의 λ¬Έμžμ—΄μ„ κ³΅λΆ€ν•˜λ©΄μ„œ 더 λ‹€λ€„λ³΄κ² μŠ΅λ‹ˆλ‹€.)

// μ•ŒνŒŒλ²³ μ•„μŠ€ν‚€ μ½”λ“œλ₯Ό κ³ λ €ν•˜λ©΄ forλ¬Έ ν•œ λ²ˆμœΌλ‘œλ„ κ°€λŠ₯.
// O(n)

let input = readLine()!

var array = [Int](repeating: 0, count: 26)
var a:Character = "a"

for alphabet in input {
    let index = Int(alphabet.asciiValue! - a.asciiValue!)
    array[index] += 1
}

print(array.map{ String($0) }.joined(separator: " "))