โซ๏ธ ์ด ๊ธ์ ์์ฑํ๋ ์ด์
์์ฃผ ๊ธฐ์ด์ ์ธ ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ, ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ์์ฃผ ๊ธฐ์ด์ ์ธ ๊ฒ์ ๋ด๊ฐ ๊ฐ๊ณผํ๊ณ ํ์๊ธฐ ๋๋ฌธ! ๊ผญ ๊ธฐ์ตํด๋๊ธฐ ์ํด์ ํฌ์คํ ์ ์์ฑํ๋ค.
โช๏ธ ๋ฐฑ์ค 1181๋ฒ - ๋จ์ด์ ๋ ฌ ๋ฌธ์
https://www.acmicpc.net/problem/1181
์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์์๋๊ตฌ???
๋ฐ๋ก, ์๊ฐ์ด๊ณผ๋ฅผ ๋ง์ฃผ์ณ๋ฒ๋ฆฐ ๊ฒ! ์๋ฌด๋ฆฌ ์ดํด๋ด๋, ์ด์ ๋ 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์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ ์ฅํ ๊ฐ์ hash๊ฐ ๊ตฌํ๊ธฐ
- 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