๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

2018 KAKAO BLIND RECRUITMENT [1์ฐจ] ๋‰ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ง Swift

by Fomagran ๐Ÿ’ป 2020. 10. 20.
728x90
๋ฐ˜์‘ํ˜•

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - [1์ฐจ] ๋‰ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ง

๋‰ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ง ์—ฌ๋Ÿฌ ์–ธ๋ก ์‚ฌ์—์„œ ์Ÿ์•„์ง€๋Š” ๋‰ด์Šค, ํŠนํžˆ ์†๋ณด์„ฑ ๋‰ด์Šค๋ฅผ ๋ณด๋ฉด ๋น„์Šท๋น„์Šทํ•œ ์ œ๋ชฉ์˜ ๊ธฐ์‚ฌ๊ฐ€ ๋งŽ์•„ ์ •์ž‘ ํ•„์š”ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. Daum ๋‰ด์Šค์˜ ๊ฐœ๋ฐœ ์—…๋ฌด๋ฅผ ๋งก๊ฒŒ ๋œ ์‹ ์ž…์‚ฌ์› ํŠœ๋ธŒ๏ฟฝ๏ฟฝ

programmers.co.kr

Foma's ํ’€์ด

 

๋ฌธ์ œํ’€์ด

 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์ž์นด๋“œ ์œ ์‚ฌ๋„๋ฅผ ํ†ตํ•ด ๋‘ ๋ฌธ์žฅ์„ ๋น„๊ตํ•ด ๊ทธ์— ๋”ฐ๋ฅธ ์œ ์‚ฌ๋„ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ธ๋ฐ์š”,

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ž์นด๋“œ ์œ ์‚ฌ๋„๊ฐ€ ๋ฌด์—‡์ผ๊นŒ์š”?

 

์ž์นด๋“œ ์œ ์‚ฌ๋„๋ž€ ๋ฌธ์„œ์˜ ์œ ์‚ฌ๋„๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ๋ฐ์š”.

 

์šฐ์„  ์˜ˆ์‹œ๋กœ ์„ค๋ช… ๋“œ๋ฆฌ๋ฉด ๋‘ ๋ฌธ์žฅ A : [์•ˆ๋…• ๋‚˜๋Š” ํฌ๋งˆ์•ผ, iOS ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์น˜ํ‚จ์„ ์ข‹์•„ํ•ด ์‚ฌ๋Š” ๊ณณ์€ ์„œ์šธ์— ์žˆ๋Š” ํ™๋Œ€์•ผ ]  ์™€ B : [์•ˆ๋…•, ๋‚˜๋Š” ๋งˆํฌ์•ผ. iOS ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ํ”ผ์ž๋ฅผ ์ข‹์•„ํ•ด. ์‚ฌ๋Š” ๊ณณ์€ ์„œ์šธ์— ์žˆ๋Š” ์‹ ์ดŒ์ด์•ผ.] ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ๋‘ ๋ฌธ์žฅ์—์„œ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„ ๋จผ์ € ์‚ดํŽด๋ณด๋ฉด [์•ˆ๋…•, iOS, ์ข‹์•„ํ•ด, ํ•˜๊ณ , ์‚ฌ๋Š”, ๊ณณ์€, ์„œ์šธ์—, ์žˆ๋Š”] ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. -> ๊ต์ง‘ํ•ฉ

 

๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฌธ์žฅ์„ ํ•ฉ์น˜๋ฉด [์•ˆ๋…• ๋‚˜๋Š” ํฌ๋งˆ์•ผ, iOS ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์น˜ํ‚จ์„ ์ข‹์•„ํ•ด ์‚ฌ๋Š” ๊ณณ์€ ์„œ์šธ์— ์žˆ๋Š” ํ™๋Œ€์•ผ , ๋งˆํฌ์•ผ, ๊ฐœ๋ฐœ์„ , ํ”ผ์ž๋ฅผ , ์‹ ์ดŒ์ด์•ผ] ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. -> ํ•ฉ์ง‘ํ•ฉ

 

์—ฌ๊ธฐ์„œ ํ•ฉ์ง‘ํ•ฉ์˜ ๊ฐฏ์ˆ˜(17)๋ฅผ ๊ต์ง‘ํ•ฉ์˜ ๊ฐฏ์ˆ˜(8)๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉด 0.47... ์ด ๋˜๋Š”๋ฐ ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ž์นด๋“œ ์œ ์‚ฌ๋„ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

 

์ฝ”๋“œํ’€์ด

 

๋ฌธ์ œ์—์„œ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ณ„์€ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ str1๊ณผ str2๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์†Œ๋ฌธ์ž๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ๋˜ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๊ฒŒ ๊ฐ ์บ๋ฆญํ„ฐ๋ฅผ ๋ฐฐ์—ดํ™” ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด map์„ ์‚ฌ์šฉํ•ด์ค๋‹ˆ๋‹ค. 

 

->  let lowerStr1 = str1.lowercased().map{$0},    let lowerStr2 = str2.lowercased().map{$0}

 

str1๊ณผ str2๋ฅผ ๋‘๋ฌธ์ž๋กœ ๋Š์€ ๊ธ€์ž๋“ค์„ ๋‹ด์„ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

- >     var set1 = [String]() ,var set2 = [String]()

 

๋‘ ๋ฌธ์žฅ์ด ๊ฒน์น˜๋Š” ๋ถ€๋ถ„ ๊ต์ง‘ํ•ฉ์„ ๋‹ด์„ ๋ฐฐ์—ด๊ณผ ๋‘ ๋ฌธ์žฅ์„ ํ•ฉ์นœ ํ•ฉ์ง‘ํ•ฉ์„ ๋‹ด์„ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

 

- >   var intersection = [String]() , var union = [String]()

 

๋จผ์ € ์†Œ๋ฌธ์ž๋กœ ๋งŒ๋“ค์–ด์ค€ lowerStr1์„ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋๊นŒ์ง€ ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. - >   for i in 0..<lowerStr1.count-1 {...}

 

์กฐ๊ฑด์—์„œ ์˜๋ฌธ์ด ์•„๋‹Œ ๊ธ€์ž๊ฐ€ ํฌํ•จ๋˜๋ฉด ๋ฒ„๋ฆฐ๋‹ค๊ณ  ํ•˜์˜€์œผ๋ฏ€๋กœ 2๊ธ€์ž ๋ชจ๋‘ ์˜๋ฌธ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๋งž๋‹ค๋ฉด set1์— ๋‹ด์•„์ค๋‹ˆ๋‹ค. -> if isAlphabet(lowerStr1[i], lowerStr1[i+1]) { set1.append("\(lowerStr1[i])\(lowerStr1[i+1])") }

 

์œ„์— isAlphabet ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ ์ด๊ฒƒ์€ ๋ฌธ์ž๊ฐ€ ๋งž๋Š”์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์ค๋‹ˆ๋‹ค.

 

-> func isAlphabet(_ char1 :Character,_ char2:Character) -> Bool {

   return char1 >= "a" && char1 <= "z" && char2 >= "a" && char1  <= "z" }

 

lowerStr2๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœํšŒํ•˜๊ณ  isAlphabet์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•˜๊ณ  set2์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

 

- >  for i in 0..<lowerStr2.count-1{

        if isAlphabet(lowerStr2[i], lowerStr2[i+1]) {

            let twoLetters = "\(lowerStr2[i])\(lowerStr2[i+1])"

            set2.append(twoLetters)

 

๊ทธ๋ฆฌ๊ณค ๋ฐ”๋กœ set1์— ํ•ด๋‹น ๋‘๊ธ€์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด๋ฏ€๋กœ intersection์— ๋„ฃ์–ด์ฃผ๊ณ  set1,set2์—์„œ ๊ฐ ๊ฐ ์‚ญ์ œํ•ด์ค๋‹ˆ๋‹ค.

 

if set1.contains(twoLetters) {

                intersection.append(twoLetters)

                set1.remove(at: set1.firstIndex(of: twoLetters)!)

                set2.remove(at: set2.firstIndex(of: twoLetters)!)

            }

 

for๋ฌธ์ด ๋๋‚œ ๋’ค set1๊ณผ set2๋ฅผ ํ•ฉ์น˜๊ณ  ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ธ ๊ต์ง‘ํ•ฉ๊นŒ์ง€ ํ•ฉ์ณ์ค˜ ํ•ฉ์ง‘ํ•ฉ์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

- > union = set1 + set2 + intersection

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ต์ง‘ํ•ฉ๊ณ  ํ•ฉ์ง‘ํ•ฉ์ด ๋ชจ๋‘ ๋น„์—ˆ์„ ๋•Œ(๊ณต์ง‘ํ•ฉ)๋Š” ๋ฌธ์ œ์—์„œ ์ •์˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ 1์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค๊ณ  ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋กœ ๋ชจ๋‘ ๊ณต์ง‘ํ•ฉ์ผ ๋• 1์— 65536์„ ๊ณฑํ•ฉ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ํ•ฉ์ง‘ํ•ฉ์—์„œ ๊ต์ง‘ํ•ฉ์„ ๋‚˜๋ˆˆ ๋’ค 65536์„ ๊ณฑํ•ฉ ์ •์ˆ˜๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. - > 

 

 return intersection.isEmpty && union.isEmpty ? 65536 :Int(Double(intersection.count)/Double(union.count)*65536)

           

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
func solution(_ str1:String, _ str2:String-> Int {
    let lowerStr1 = str1.lowercased().map{$0}
    let lowerStr2 = str2.lowercased().map{$0}
    var set1 = [String]()
    var set2 = [String]()
    var intersection = [String]()
    var union = [String]()
    
    for i in 0..<lowerStr1.count-1 {
        if isAlphabet(lowerStr1[i], lowerStr1[i+1]) {
            set1.append("\(lowerStr1[i])\(lowerStr1[i+1])")
        }
    }
    
    for i in 0..<lowerStr2.count-1{
        if isAlphabet(lowerStr2[i], lowerStr2[i+1]) {
            let twoLetters = "\(lowerStr2[i])\(lowerStr2[i+1])"
            set2.append(twoLetters)
            if set1.contains(twoLetters) {
                intersection.append(twoLetters)
                set1.remove(at: set1.firstIndex(of: twoLetters)!)
                set2.remove(at: set2.firstIndex(of: twoLetters)!)
            }
        }
    }
    
    union = set1 + set2 + intersection
    
    return intersection.isEmpty && union.isEmpty ? 65536 :Int(Double(intersection.count)/Double(union.count)*65536)
}
 
func isAlphabet(_ char1 :Character,_ char2:Character) -> Bool {
   return char1 >= "a" && char1 <= "z" && char2 >= "a" && char1  <= "z"
}

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€