โณ
Level 2 2018 KAKAO BLIND RECRUITMENT (3์๊ฐ?๐ )
[1์ฐจ] ๋ด์ค ํด๋ฌ์คํฐ๋ง
๋ฌธ์ ํ๋ฉด์๋ ๊ณ์ ํท๊ฐ๋ ค์ ์ค๋ ๊ฑธ๋ ธ๋ค.. ์ผ !
์ง์ง ์นด์นด์ค๋ ๋ฌธ์ ๊ฐ ๋์ฐํ๊ฒ ๊ธธ๊ณ ๋ณต์กํ๋ฏ.. ๐คข ๋ฌธ์ ๊ผผ๊ผผํ๊ฒ ์์ฝ์!
๋ฌธ์ ์ค๋ช
์ ์ฌํ ๊ธฐ์ฌ๋ฅผ ๋ฌถ๋ ๊ธฐ์ค์ ์ ํ๊ธฐ ์ํด์ ๋ ผ๋ฌธ๊ณผ ์๋ฃ๋ฅผ ์กฐ์ฌํ๋ ํ๋ธ๋ "์์นด๋ ์ ์ฌ๋"๋ผ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋๋ค.
์์นด๋ ์ ์ฌ๋๋ ์งํฉ ๊ฐ์ ์ ์ฌ๋๋ฅผ ๊ฒ์ฌํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก ์๋ ค์ ธ ์๋ค. ๋ ์งํฉ A, B ์ฌ์ด์ ์์นด๋ ์ ์ฌ๋ J(A, B)๋ ๋ ์งํฉ์ ๊ต์งํฉ ํฌ๊ธฐ๋ฅผ ๋ ์งํฉ์ ํฉ์งํฉ ํฌ๊ธฐ๋ก ๋๋ ๊ฐ์ผ๋ก ์ ์๋๋ค.
์๋ฅผ ๋ค์ด ์งํฉ A = {1, 2, 3}, ์งํฉ B = {2, 3, 4}๋ผ๊ณ ํ ๋, ๊ต์งํฉ A ∩ B = {2, 3}, ํฉ์งํฉ A ∪ B = {1, 2, 3, 4}์ด ๋๋ฏ๋ก, ์งํฉ A, B ์ฌ์ด์ ์์นด๋ ์ ์ฌ๋ J(A, B) = 2/4 = 0.5๊ฐ ๋๋ค. ์งํฉ A์ ์งํฉ B๊ฐ ๋ชจ๋ ๊ณต์งํฉ์ผ ๊ฒฝ์ฐ์๋ ๋๋์ ์ด ์ ์๋์ง ์์ผ๋ ๋ฐ๋ก J(A, B) = 1๋ก ์ ์ํ๋ค.
์์นด๋ ์ ์ฌ๋๋ ์์์ ์ค๋ณต์ ํ์ฉํ๋ ๋ค์ค์งํฉ์ ๋ํด์ ํ์ฅํ ์ ์๋ค. ๋ค์ค์งํฉ A๋ ์์ "1"์ 3๊ฐ ๊ฐ์ง๊ณ ์๊ณ , ๋ค์ค์งํฉ B๋ ์์ "1"์ 5๊ฐ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ์. ์ด ๋ค์ค์งํฉ์ ๊ต์งํฉ A ∩ B๋ ์์ "1"์ min(3, 5)์ธ 3๊ฐ, ํฉ์งํฉ A ∪ B๋ ์์ "1"์ max(3, 5)์ธ 5๊ฐ ๊ฐ์ง๊ฒ ๋๋ค. ๋ค์ค์งํฉ A = {1, 1, 2, 2, 3}, ๋ค์ค์งํฉ B = {1, 2, 2, 4, 5}๋ผ๊ณ ํ๋ฉด, ๊ต์งํฉ A ∩ B = {1, 2, 2}, ํฉ์งํฉ A ∪ B = {1, 1, 2, 2, 3, 4, 5}๊ฐ ๋๋ฏ๋ก, ์์นด๋ ์ ์ฌ๋ J(A, B) = 3/7, ์ฝ 0.42๊ฐ ๋๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด ์ฌ์ด์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋๋ฐ ์ด์ฉํ ์ ์๋ค. ๋ฌธ์์ด "FRANCE"์ "FRENCH"๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ๋ ๊ธ์์ฉ ๋์ด์ ๋ค์ค์งํฉ์ ๋ง๋ค ์ ์๋ค. ๊ฐ๊ฐ {FR, RA, AN, NC, CE}, {FR, RE, EN, NC, CH}๊ฐ ๋๋ฉฐ, ๊ต์งํฉ์ {FR, NC}, ํฉ์งํฉ์ {FR, RA, AN, NC, CE, RE, EN, CH}๊ฐ ๋๋ฏ๋ก, ๋ ๋ฌธ์์ด ์ฌ์ด์ ์์นด๋ ์ ์ฌ๋ J("FRANCE", "FRENCH") = 2/8 = 0.25๊ฐ ๋๋ค.
์ ๋ ฅ ํ์
- ์ ๋ ฅ์ผ๋ก๋ str1๊ณผ str2์ ๋ ๋ฌธ์์ด์ด ๋ค์ด์จ๋ค. ๊ฐ ๋ฌธ์์ด์ ๊ธธ์ด๋ 2 ์ด์, 1,000 ์ดํ์ด๋ค.
- ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ฌธ์์ด์ ๋ ๊ธ์์ฉ ๋์ด์ ๋ค์ค์งํฉ์ ์์๋ก ๋ง๋ ๋ค. ์ด๋ ์๋ฌธ์๋ก ๋ ๊ธ์ ์๋ง ์ ํจํ๊ณ , ๊ธฐํ ๊ณต๋ฐฑ์ด๋ ์ซ์, ํน์ ๋ฌธ์๊ฐ ๋ค์ด์๋ ๊ฒฝ์ฐ๋ ๊ทธ ๊ธ์ ์์ ๋ฒ๋ฆฐ๋ค. ์๋ฅผ ๋ค์ด "ab+"๊ฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ฉด, "ab"๋ง ๋ค์ค์งํฉ์ ์์๋ก ์ผ๊ณ , "b+"๋ ๋ฒ๋ฆฐ๋ค.
- ๋ค์ค์งํฉ ์์ ์ฌ์ด๋ฅผ ๋น๊ตํ ๋, ๋๋ฌธ์์ ์๋ฌธ์์ ์ฐจ์ด๋ ๋ฌด์ํ๋ค. "AB"์ "Ab", "ab"๋ ๊ฐ์ ์์๋ก ์ทจ๊ธํ๋ค.
์ถ๋ ฅ ํ์
์ ๋ ฅ์ผ๋ก ๋ค์ด์จ ๋ ๋ฌธ์์ด์ ์์นด๋ ์ ์ฌ๋๋ฅผ ์ถ๋ ฅํ๋ค. ์ ์ฌ๋ ๊ฐ์ 0์์ 1 ์ฌ์ด์ ์ค์์ด๋ฏ๋ก, ์ด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ฝ๋๋ก 65536์ ๊ณฑํ ํ์ ์์์ ์๋๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ ์๋ถ๋ง ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์์
print(solution("FRANCE", "french")) //16384
print(solution("handshake", "shake hands")) //16384
print(solution("aa1+aa2", "AAAA12")) //43690
print(solution("E=M*C^2", "e=m*c^2")) //65536
๋ด ๋ต์
func solution(_ str1:String, _ str2:String) -> Int {
//๋ค์ค์งํฉ ์์ ๋ง๋ค๊ธฐ
func letterSet(_ str: String) -> [String] {
var str = str.lowercased()
var arr = [String]()
while str.count > 1 {
var letter = ""
for i in str.prefix(2) {
if i.isLetter {
letter += String(i)
}
}
if letter.count == 2 {
arr.append(letter)
}
str = String(str.dropFirst())
}
return arr
}
let arr1 = letterSet(str1)
let arr2 = letterSet(str2)
if arr1.count == 0 && arr2.count == 0 { return 65536 }
//๊ต์งํฉ ๊ตฌํ๊ธฐ
var intersection = 0
let inter = arr1.filter{ arr2.contains($0) }
for i in Set(inter) {
let count1 = arr1.filter{ $0 == i }.count
let count2 = arr2.filter{ $0 == i }.count
intersection += min(count1, count2)
}
//ํฉ์งํฉ ๊ตฌํ๊ธฐ
let union = arr1.count + arr2.count - intersection
let result = 65536 * Double(intersection) / Double(union)
return Int(result)
}
ํ์ด๊ณผ์
์ค๋ณต ์์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด ๊น๋ค๋ก์ ๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค์ค์งํฉ ์์ฑ ์ ์ธ๋ฑ์ฑ์ ์ถ๊ฐํด์ ์ค๋ณต๋์ง ์๊ฒ ๋ง๋ค์ด๋ณผ๊น ์๊ฐ๋ ํ๋๋ฐ, ๊ตฌํ์ ๊ทธ๊ฒ ๋ ๋ณต์กํ ๊ฒ ๊ฐ์์ ํฉ/๊ต์งํฉ ๋ง๋ค๋ ์ฒ๋ฆฌํ๊ธฐ๋ก ํ๋ค. ๋๋ถ์ ๊ต์งํฉ ๋ง๋ค๋ ๊ณ์ ํท๊ฐ๋ ค์ ์ ๋จน์๋ค ใ
1. ๋ค์ค์งํฉ ๊ตฌํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ ๋ก์ง์ผ๋ก ์ฃผ์ด์ง ๋ฌธ์์ด์ ๋ค์ค์งํฉ์ ๊ตฌํด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค
1) ๋ฌธ์์ด์ ์๋ฌธ์๋ก ๋ณํ
2) ์๊ธ์ ๋ ๊ฐ๊ฐ ๋ชจ๋ ์ํ๋ฒณ ๋ฌธ์๋ฉด ๋ค์ค์งํฉ ์์๋ก ์ถ๊ฐ
3) ๋ฌธ์์ด ๋งจ ์๊ธ์ ์ ๊ฑฐ
2. ๊ต์งํฉ / ํฉ์งํฉ ๊ฐฏ์ ๊ตฌํ๊ธฐ
์์์ ์ค๋ณต์ ํ์ฉํ๋ ๋ค์ค์งํฉ์ด๋ผ๋ ๊ฒ์ ๋ช ์ฌํด์ผ ํ๋ค! ์ด๊ฑฐ ๋๋ฌธ์ ๋๋ฌด ํท๊ฐ๋ ค์ ์๊ฐ ๋ง์ด ๋ ๋ ธ๋ค..
1) ๋ ๋ค์ค์งํฉ์์ ๊ณตํต์ผ๋ก ๊ฐ์ง๋ ์์ ๋ฐฐ์ด inter ์์ฑ (์์ ์ค๋ณต ๊ฐ๋ฅ)
2) ์์ ์ค๋ณต์ ์์ค Set(inter)๋ก ๋ฐ๋ณต๋ฌธ์ ๋๋ ค, ๋ ๋ค์ค์งํฉ์ ์์ ๊ฐฏ์๋ฅผ ๊ตฌํด์ค ํ ๋ ์์ ์๋ฅผ ๊ต์งํฉ ๊ฐฏ์์ ๋ํด์ค๋ค.
3) ํฉ์งํฉ = ์งํฉA + ์งํฉB - A๊ต์งํฉB
์ฒ์์ ๋ฌธ์ ์ดํด๋ฅผ ์๋ชปํด์ ์ข ํค๋งธ๋ค.
์์์ ์ค๋ณต์ ํ์ฉํ๋ ๋ค์ค์งํฉ์ด๋ผ๋ ๊ฒ์ ๊ฐ๊ณผํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ํฉ์งํฉ ๊ต์งํฉ์ ๊ตฌํด์ฃผ์๋๋ ๋น์ฐํ ๋ต์ด ์๋์ค๋๋ผ.
//ํฉ์งํฉ
let union = Set(arr1 + arr2).count
//๊ต์งํฉ
let intersection = arr1.filter{ arr2.contains($0) }.count
3. ๊ฒฐ๊ณผ๊ฐ ๊ณ์ฐ ๋ฐ ๋ฐํ
๋ณด์ ๋ต์
๋ด ์ฝ๋ ๋๋ฌด ๊ธธ๊ณ ๋นํจ์จ์ ์ธ๊ฐ ๊ฑฑ์ ํ๋๋ฐ, ๋ค๋ฅธ ๋ถ๋ค ์ฝ๋๋ ๋ง๋ง์น ์๋๋ผ. ์๋ ๋ณต์กํ๊ณ ๊น๋ค๋ก์ด ๋ฌธ์ ๋ผ..
๋ค์ค์งํฉ ์์ ๋ง๋ค ๋, ๋ฌธ์์ด์ด ์๋๋ผ ๋ฐฐ์ด๋ก ๋งคํํด์ค ํ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋ if๋ฌธ์ ์ค์ผ ์ ์์ด ์ฝ๋๊ฐ ์ข ๋ ๊ฐ๊ฒฐํด์ก๋ค.
๊ต์งํฉ์ ๊ตฌํ ๋์๋ filter๋ก ๊ต์งํฉ ์์ ๊ตฌํด์ Set ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ์ง ์์๋, Set์์ ์ง์๋๋ intersection ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ข ๋ ๊ฐ๊ฒฐํ๊ฒ ์ค์ผ ์ ์์๋ค.
//๋ค์ค์งํฉ ์์ ๋ง๋ค๊ธฐ
func letterSet(_ str: String) -> [String] {
let str = str.map{ $0.lowercased() }
var arr = [String]()
for i in 0..<str.count - 1 {
if Character(str[i]).isLetter && Character(str[i+1]).isLetter {
arr.append(str[i] + str[i+1])
}
}
return arr
}
let arr1 = letterSet(str1)
let arr2 = letterSet(str2)
//๊ต์งํฉ ๊ตฌํ๊ธฐ
var intersection = 0
for i in Set(arr1).intersection(Set(arr2)) {
let count1 = arr1.filter{ $0 == i }.count
let count2 = arr2.filter{ $0 == i }.count
intersection += min(count1, count2)
}
'Algorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift ์๊ณ ๋ฆฌ์ฆ] Programmers ํผ๋ณด๋์น ์ (0) | 2022.11.13 |
---|---|
[Swift ์๊ณ ๋ฆฌ์ฆ] Programmers ๋ฉ๋ฆฌ๋ฐ๊ธฐ (0) | 2022.11.13 |
[Swift ์๊ณ ๋ฆฌ์ฆ] Programmers ํ๊ฒ ๋๋ฒ (0) | 2022.11.05 |
[Swift ์๊ณ ๋ฆฌ์ฆ] Programmers ์์ด ๋๋ง์๊ธฐ (0) | 2022.11.05 |
[Swift ์๊ณ ๋ฆฌ์ฆ] Programmers ํ๋ฆฐํฐ (0) | 2022.11.04 |