πŸ“– Problem Solution/Programmers

2019 KAKAO BLIND RECUITMENT μ‹€νŒ¨μœ¨ Swift

Fomagran πŸ’» 2020. 3. 5. 01:19
728x90
λ°˜μ‘ν˜•

슈퍼 κ²Œμž„ 개발자 μ˜€λ λ¦¬λŠ” 큰 고민에 λΉ μ‘Œλ‹€. κ·Έλ…€κ°€ λ§Œλ“  ν”„λžœμ¦ˆ μ˜€μ²œμ„±μ΄ λŒ€μ„±κ³΅μ„ κ±°λ’€μ§€λ§Œ, μš”μ¦˜ μ‹ κ·œ μ‚¬μš©μžμ˜ μˆ˜κ°€ κΈ‰κ°ν•œ 것이닀. 원인은 μ‹ κ·œ μ‚¬μš©μžμ™€ κΈ°μ‘΄ μ‚¬μš©μž 사이에 μŠ€ν…Œμ΄μ§€ 차이가 λ„ˆλ¬΄ 큰 것이 λ¬Έμ œμ˜€λ‹€.

이 문제λ₯Ό μ–΄λ–»κ²Œ ν• κΉŒ κ³ λ―Ό ν•œ κ·Έλ…€λŠ” λ™μ μœΌλ‘œ κ²Œμž„ μ‹œκ°„μ„ λŠ˜λ €μ„œ λ‚œμ΄λ„λ₯Ό μ‘°μ ˆν•˜κΈ°λ‘œ ν–ˆλ‹€. μ—­μ‹œ 슈퍼 개발자라 λŒ€λΆ€λΆ„μ˜ λ‘œμ§μ€ μ‰½κ²Œ κ΅¬ν˜„ν–ˆμ§€λ§Œ, μ‹€νŒ¨μœ¨μ„ κ΅¬ν•˜λŠ” λΆ€λΆ„μ—μ„œ μœ„κΈ°μ— λΉ μ§€κ³  λ§μ•˜λ‹€. 였렐리λ₯Ό μœ„ν•΄ μ‹€νŒ¨μœ¨μ„ κ΅¬ν•˜λŠ” μ½”λ“œλ₯Ό μ™„μ„±ν•˜λΌ.

  • μ‹€νŒ¨μœ¨μ€ λ‹€μŒκ³Ό 같이 μ •μ˜ν•œλ‹€.
    • μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν–ˆμœΌλ‚˜ 아직 ν΄λ¦¬μ–΄ν•˜μ§€ λͺ»ν•œ ν”Œλ ˆμ΄μ–΄μ˜ 수 / μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν•œ ν”Œλ ˆμ΄μ–΄ 수

전체 μŠ€ν…Œμ΄μ§€μ˜ 개수 N, κ²Œμž„μ„ μ΄μš©ν•˜λŠ” μ‚¬μš©μžκ°€ ν˜„μž¬ λ©ˆμΆ°μžˆλŠ” μŠ€ν…Œμ΄μ§€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ stagesκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ‹€νŒ¨μœ¨μ΄ 높은 μŠ€ν…Œμ΄μ§€λΆ€ν„° λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μŠ€ν…Œμ΄μ§€μ˜ λ²ˆν˜Έκ°€ λ‹΄κ²¨μžˆλŠ” 배열을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜λΌ.

μ œν•œμ‚¬ν•­

  • μŠ€ν…Œμ΄μ§€μ˜ 개수 N은 1 μ΄μƒ 500 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.
  • stages의 κΈΈμ΄λŠ” 1 μ΄μƒ 200,000 μ΄ν•˜μ΄λ‹€.
  • stagesμ—λŠ” 1 μ΄μƒ N + 1 μ΄ν•˜μ˜ μžμ—°μˆ˜κ°€ λ‹΄κ²¨μžˆλ‹€.
    • 각 μžμ—°μˆ˜λŠ” μ‚¬μš©μžκ°€ ν˜„μž¬ 도전 쀑인 μŠ€ν…Œμ΄μ§€μ˜ 번호λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    • 단, N + 1 μ€ λ§ˆμ§€λ§‰ μŠ€ν…Œμ΄μ§€(N 번째 μŠ€ν…Œμ΄μ§€) κΉŒμ§€ 클리어 ν•œ μ‚¬μš©μžλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • λ§Œμ•½ μ‹€νŒ¨μœ¨μ΄ 같은 μŠ€ν…Œμ΄μ§€κ°€ μžˆλ‹€λ©΄ μž‘μ€ 번호의 μŠ€ν…Œμ΄μ§€κ°€ λ¨Όμ € μ˜€λ„λ‘ ν•˜λ©΄ λœλ‹€.
  • μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν•œ μœ μ €κ°€ μ—†λŠ” 경우 ν•΄λ‹Ή μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ 0 μœΌλ‘œ μ •μ˜ν•œλ‹€.

μž…μΆœλ ₯ 예

 

N stages result
5 [2, 1, 2, 6, 2, 4, 3, 3] [3,4,2,1,5]
4 [4,4,4,4,4] [4,1,2,3]

풀이:μš°μ„ μ€ failμ΄λΌλŠ” λ”•μ…”λ„ˆλ¦¬λ₯Ό λ„£μ–΄ 각 μŠ€ν…Œμ΄μ§€μ™€ μ‹€νŒ¨μœ¨μ„ key와 valueκ°’μœΌλ‘œ λ„£λŠ”λ‹€.

μ‹€νŒ¨μœ¨μ„ κ΅¬ν•˜λŠ” 법은 μš°μ„  stages에 μ‘΄μž¬ν•˜λŠ” μˆ«μžλ“€μ„ μ°¨λ‘€λŒ€λ‘œ 갯수λ₯Ό countλΌλŠ” λ³€μˆ˜λ‘œ μ„Έμ–΄μ€€λ‹€.

λ§Œμ•½ 0이라면 ν•΄λ‹Ή μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ„ 0으둜 λ„£κ³  μ•„λ‹ˆλΌλ©΄ 남은 ν”Œλ ˆμ΄μ–΄λ₯Ό count둜 λ‚˜λˆ μ€€λ‹€.

예) 총 2λ‹¨κ³„μ˜ μŠ€ν…Œμ΄μ§€μ—μ„œ 8λͺ…μ˜ ν”Œλ ˆμ΄μ–΄ 쀑 7λͺ…이 1단계 1λͺ…이 2단계에 μžˆλ‹€λ©΄ 

1단계에 7λͺ…이 μžˆμœΌλ―€λ‘œ 7/8 이 μ‹€νŒ¨μœ¨μ΄ λœλ‹€.

2단계에선 7λͺ…이 이미 1단계에 μžˆμœΌλ―€λ‘œ 8-7 = 1 1을 1둜 λ‚˜λˆ μ£Όλ©΄ μ‹€νŒ¨μœ¨μ€ 1이 λœλ‹€.

κ·Έλ ‡κ²Œ ꡬ해쀀 λ’€ 쀑볡값을 λΉΌκΈ° μœ„ν•΄ sλΌλŠ” setλ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ£Όκ³  fail의 value값을 λͺ¨λ‘ 넣은 λ‹€μŒμ—

for문에 sλ₯Ό μ—­μ •λ ¬ν•œ 것 쀑 fail의 ν‚€ 값이 같은 게 μžˆλ‹€λ©΄ arr에 λ„£μ–΄μ€˜λΌ 라고 ν•˜λ©΄ indexκ°€ μ°¨λ‘€λŒ€λ‘œ μ‹€νŒ¨μœ¨μ΄ 높은 값에 따라 λ“€μ–΄κ°„λ‹€.

1.λ”•μ…”λ„ˆλ¦¬λ‘œ 킀와 λ°Έλ₯˜κ°’을 λ§Œλ“€κ³ 

2.μ„ΈνŠΈμ— λ°Έλ₯˜κ°’λ§Œ λ„£μ–΄μ„œ μ •λ ¬ν•΄ μ€€ λ’€

3.λ‹€μ‹œ 포문으둜 μ„ΈνŠΈκ°’κ³Ό fail의 λ°Έλ₯˜κ°’을 비ꡐ해주면 μ •λ ¬λœ 킀값을 μ•Œμ•„λ‚Ό 수 μžˆλ‹€.

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
import Foundation
 
func solution(_ N:Int, _ stages:[Int]) -> [Int] {
    var fail = [Int:Double]()
    var arr = [Int]()
    var s = Set<Double>()
    var left = stages.count
    for j in 1...N{
        var count = 0
        for i in 0..<stages.count{
            if stages[i] == j{
                count += 1
            }
        }
        if count == 0{
            fail[j] = 0
        }else{
        fail[j] = Double(count)/Double(left)
        }
        left = left - count
    }
    for (_,value) in fail{
        s.insert(value)
    }
    for i in s.sorted(by:>){
        for j in 1...fail.count{
            if i == fail[j]{
                arr.append(j)
            }
        }
    }
    return arr
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

λ‹€λ₯Έ μ‚¬λžŒ 풀이 쀑 κ°€μž₯ μ’‹λ‹€κ³  μƒκ°ν•˜λŠ” 것

풀이:μš°μ„  Array(repeating,count)λ₯Ό μ΄μš©ν•΄μ„œ μŠ€ν…Œμ΄μ§€ 갯수의 +1만큼의 길이의 배열을 λ§Œλ“€μ–΄μ€€λ‹€.

κ·Έ λ‹€μŒ 포문을 μ΄μš©ν•˜μ—¬ μ—­μˆœμœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.

그리고 그것에 맞게 r에 μ‹€νŒ¨μœ¨μ„ λ„£μ–΄μ€€λ‹€.

r을 enumrated()둜 offsetκ³Ό elementλ₯Ό μ•Œμ•„λ‚΄μ–΄ element값에 맞게 μ—­μˆœμœΌλ‘œ μ •λ ¬ν•΄μ€€λ’€ 각 element의 offset에 +1 ν•΄μ€€ 값을 map을 톡해 λ°°μΉ˜ν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import Foundation
 
func solution(_ n: Int, _ stages: [Int]) -> [Int] {
  var rates = Array(repeating: 0, count: n + 1)
  for stage in stages {
    for i in 0..<stage {
      rates[i] += 1
    }
  }
 
  var r = [Double]()
  for i in 0..<n {
    let offset = i + 1
    r.append(Double(rates[i] - rates[offset]) / Double(rates[i]))
  }
  return r.enumerated()
    .sorted(by: { $0.element > $1.element })
    .map({ $0.offset + 1 })
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
728x90
λ°˜μ‘ν˜•