Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

potato's iOS Story/๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋งŒ๋‚œ ์นœ๊ตฌ๋“ค

[์ž๋ฃŒ๊ตฌ์กฐ] Set๊ณผ Array์ค‘์— Set์ด ์™œ ๋” ๋น ๋ฅธ๊ฑธ๊นŒ?

๊ฐ์ž ๐Ÿฅ” 2023. 3. 10. 19:57
๋ฐ˜์‘ํ˜•

โšซ๏ธ ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ์ด์œ 

์•„์ฃผ ๊ธฐ์ดˆ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€, ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์•„์ฃผ ๊ธฐ์ดˆ์ ์ธ ๊ฒƒ์„ ๋‚ด๊ฐ€ ๊ฐ„๊ณผํ•˜๊ณ  ํ’€์—ˆ๊ธฐ ๋–„๋ฌธ! ๊ผญ ๊ธฐ์–ตํ•ด๋‘๊ธฐ ์œ„ํ•ด์„œ ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•œ๋‹ค.

โ–ช๏ธ ๋ฐฑ์ค€ 1181๋ฒˆ - ๋‹จ์–ด์ •๋ ฌ ๋ฌธ์ œ

https://www.acmicpc.net/problem/1181

 

1181๋ฒˆ: ๋‹จ์–ด ์ •๋ ฌ

์ฒซ์งธ ์ค„์— ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 20,000) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋‹จ์–ด๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 50์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.

www.acmicpc.net

์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋ƒ๊ตฌ??? 

๋ฐ”๋กœ, ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ๋งˆ์ฃผ์ณ๋ฒ„๋ฆฐ ๊ฒƒ! ์•„๋ฌด๋ฆฌ ์‚ดํŽด๋ด๋„, ์ด์œ ๋Š” array๋ฅผ ์‚ฌ์šฉํ•ด์„œ '์ค‘๋ณต์ฒ˜๋ฆฌ'๋ฅผ ํ•ด์ฃผ๋Š” ๊ณผ์ •์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

โ–ช๏ธ ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ๋ฅผ ๋ณด์ž -> Array๋ฅผ ์‚ฌ์šฉ

import Foundation

let n = Int(readLine()!)!
var words = [String]()
for _ in 0..<n {
    let temp = readLine()!
    if !words.contains(temp) {
        words.append(temp)
    }
}

let sortArr = words.sorted {
    if $0.count == $1.count {
        return $0 < $1
    } else {
        return $0.count < $1.count
    }
}

for word in sortArr {
    print(word)
}

๋ฌธ์ œ์—์„œ ๋‹จ์ˆœํžˆ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ์ค‘๋ณต์„ ์ œ์™ธํ•ด๋‹ฌ๋ผ๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ input์—์„œ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ, contains ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋งŒ words ๋ฐฐ์—ด์— append ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ๋‹ค. (์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ ๋ณ„๋‹ค๋ฅธ ์ด์œ ๋Š” ์—†๋‹ค. ๊ทธ๋ƒฅ ์ƒ๊ฐ๋‚œ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•ด๋‚ธ๊ฒƒ!)

๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ๋ฌด์ž‘์ • ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๋‹ค์งํ–ˆ๋Š”๋ฐ, ์‰ฌ์šด๋ฌธ์ œ๋ผ๊ณ  ๋„ˆ๋ฌด ๋ฌด์‹œํ–ˆ๋‚˜๋ณด๋‹ค ใ… ใ…  ์•ž์œผ๋กœ ๊ผญ ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ๋ƒ…๋‹ค ์ฝ”๋“œ๋ฅผ ์น˜์ง€ ๋ง๊ณ  ์ƒ๊ฐ์„ ๊ฑฐ์นœ ํ›„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž....

โ–ช๏ธ ๋งž์€ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. -> Set ์‚ฌ์šฉ

import Foundation

let n = Int(readLine()!)!
var words = Set<String>()
for _ in 0..<n {
    words.insert(readLine()!)
}

let sortArr = words.sorted {
    if $0.count == $1.count {
        return $0 < $1
    } else {
        return $0.count < $1.count
    }
}

for word in sortArr {
    print(word)
}

์ฝ”๋“œ๋Š” ๋™์ผํ•˜์ง€๋งŒ, words ๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ Set์„ ํ™œ์šฉํ–ˆ๋‹ค. Set์€ ์ง‘ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต์€ ์•Œ์•„์„œ ๋‹ด๊ธฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ์„ฑ์งˆ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ๋ฌผ๋ก , ์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ๋•Œ set์œผ๋กœ ํ•˜๋ฉด ์ž๋™ ์ค‘๋ณต์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋‹ˆ๊นŒ~ ํ•˜๊ณ  ์ƒ๊ฐํ•˜๊ธด ํ–ˆ์ง€๋งŒ, ๊ทธ๋ƒฅ append๊ฐ€ ๋” ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ƒ…๋‹ค append๋ฅผ ๊ฐˆ๊ฒผ๋˜๊ฒƒ์ด๋‹ค. ์—ญ์‹œ๋‚˜ Set์„ ์ด์šฉํ•ด์•ผํ–ˆ์–ด.... ์™œ?

array์™€ set ๋‘๊ฐœ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ๊ทผ๋ฐ ์™œ Set์ด ๋” ๋น ๋ฅธ๊ฑธ๊นŒ?

 

โšซ๏ธ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

โ–ช๏ธ Set์˜ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

Set์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

  1. ์ €์žฅํ•  ๊ฐ’์˜ hash๊ฐ’ ๊ตฌํ•˜๊ธฐ
  2. hash๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๊ณต๊ฐ„ (bucket)์— ๊ฐ’์„ ์ €์žฅํ•จ
    • ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ํ•ด์‹œ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” bucket์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ์—†๋‹ค. ์ฆ‰, index๊ฐ€ ์—†๋‹ค. 
    • ํ•ด์‹œ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๊ฐ’์ด ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.
    • ํ•ด์‹œ๊ฐ’ ๊ธฐ๋ฐ˜์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— look up์ด ๋น ๋ฅด๋‹ค. (set์˜ ๊ธธ์ด์™€ ์ƒ๊ด€ ์—†์ด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋‹จ์ˆœ ํ•ด์‹œ๊ฐ’์„ ๋ณด๊ณ  bucket์„ ํ™•์ธํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—)

โ–ช๏ธ Array ์˜ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

Array๋Š” ์ผ์ • ํฌ๊ธฐ์˜ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋“ค์„ '์ˆœ์ฐจ์ '์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. 

โšซ๏ธ ๊ทธ๋ž˜์„œ Set์ด ๋” ๋น ๋ฅธ ์ด์œ ๋Š”? ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ ์ด์œ ๋Š”?

์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๊ณต๋ถ€๋ฅผ ํ•ด๋ดค์œผ๋ฉด, hash๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. set์€ array์™€ ๋‹ค๋ฅด๊ฒŒ hash๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ณ  ์กฐํšŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— set์ด ๋” ๋น ๋ฅด๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ์ ์€ array์—์„œ containํ•˜๋Š” ๊ณผ์ •์˜ ์œ ๋ฌด์ด๋‹ค. 

Array์— append ํ•˜๋Š”๊ฒƒ๋„ O(1), set์— insertํ•˜๋Š” ๊ฒƒ๋„ O(1)์ด์ง€๋งŒ, contains ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ™•์—ฐํžˆ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค. 
Array์—์„œ ํŠน์ • ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” Contains ๋ฉ”์„œ๋“œ๋Š” O(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋ฐฐ์—ด์—์„œ๋Š” ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ ํ˜•ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ N๋งŒํผ ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ณ , ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ ๊ฒƒ์ด๋‹ค.

Set์—์„œ๋„ contains๋ฉ”์„œ๋“œ๋ฅผ ๋˜‘๊ฐ™์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์•ž์„œ ๋งํ–ˆ๋“ฏ, hash๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— set์—์„œ contains ํ•ด์„œ ํŠน์ • ๊ฐ’์„ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ•œ, O(1)๋ฐ–์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. 

set์ด ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฅด๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ๋ญ”์ง€ ๋” ๊ถ๊ธˆํ•˜๋ฉด ์•„๋ž˜ ์ฐธ๊ณ ์ž๋ฃŒ๋ฅผ ์‚ดํŽด๋ณด์ž.

https://analytics4everything.tistory.com/m/180 

 

Set, Dict์˜ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๊ฒ€์ƒ‰์ด ๋น ๋ฅธ ์ด์œ ? hash ํ•จ์ˆ˜

Summary: set, dict์€ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ•ด์‹œ๊ฐ’์„ ์ €์žฅํ•˜๊ณ ์žˆ๋Š” ํ•ด์‹œํ…Œ์ด๋ธ”์ด๋ž€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋น ๋ฅธ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•จ. ํ•ด์‹œ๋Š” ์ž„์˜์˜ ๋ณ€์ˆ˜(๋ฌธ์ž์—ด ๋“ฑ)๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ, ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ

analytics4everything.tistory.com

 

๋ฐ˜์‘ํ˜•