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

[Swift] 2018 KAKAO BLIND RECRUITMENT [1์ฐจ] ์ถ”์„ ํŠธ๋ž˜ํ”ฝ

by Fomagran ๐Ÿ’ป 2021. 5. 19.
728x90
๋ฐ˜์‘ํ˜•

 

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - [1์ฐจ] ์ถ”์„ ํŠธ๋ž˜ํ”ฝ

์ž…๋ ฅ: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15 20:59:58.299 0.8s", "2016-09-15 20:59:58.688 1.041s", "2016-09-15 20:59:59.591 1.412s", "2016-09-15 21:00:00.464 1.466s", "2016-09-15 21:00:00.741 1.581s", "2016-09-1

programmers.co.kr


Solution

 

1. ์š”์ฒญ์ด ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.


split์„ ์ด์šฉํ•ด ์ฃผ์–ด์ง„ ์š”์ฒญ๋“ค์„ ๊ฐ ์‹œ๊ฐ„,๋ถ„,์ดˆ๋ฅผ ๊ตฌํ•ด ๋ชจ๋‘ ์ดˆ๋กœ ํ™˜์‚ฐํ•ด์คŒ.

 

(calculateEndTime ํ•จ์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

2. ์š”์ฒญ์ด ์‹œ์ž‘๋˜๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค.


์š”์ฒญ์ด ๋๋‚˜๋Š” ์‹œ๊ฐ„์— ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ๋นผ์„œ ์‹œ์ž‘๋˜๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•ด์ค€๋‹ค.

 

(calculateStartTime ํ•จ์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

3. ์š”์ฒญ์˜ ์‹œ์ž‘๊ณผ ๋์„ ๋ชจ์•„์ค€๋‹ค.


์š”์ฒญ๋“ค์˜ ์‹œ์ž‘๊ณผ ๋ ์‹œ๊ฐ„์— +1์„ ํŠœํ”Œ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๋ฐฐ์—ด์— ๋ชจ์•„์ค€๋‹ค.

๋ ์‹œ๊ฐ„์— +1์„ ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” n~n+1์ดˆ์— ์žˆ๋Š” ์š”์ฒญ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

(appendRequests ํ•จ์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

4. ์ตœ๋Œ€ ์š”์ฒญ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.


์š”์ฒญ๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ˜„์žฌ ์ธ๋ฑ์Šค๋ณด๋‹ค ์ดํ›„ ์š”์ฒญ๋“ค๊ณผ ๋น„๊ตํ•˜์—ฌ

ํ˜„์žฌ์š”์ฒญ์˜ ๋ ์‹œ๊ฐ„๋ณด๋‹ค ๋‹ค๋ฅธ ์š”์ฒญ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๋” ์ž‘๋‹ค๋ฉด

์š”์ฒญ๋“ค์€ ์™„๋ฃŒ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด ํฌํ•จ๋˜๋ฏ€๋กœ ๊ฐฏ์ˆ˜๋ฅผ ๋”ํ•ด์ค€๋‹ค.

 

(findMaxRequestCount ํ•จ์ˆ˜๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)


Source Code

 

import Foundation
func solution(_ lines:[String]) -> Int {
//์ตœ๋Œ€ ์š”์ฒญ์‹œ๊ฐ„์„ ๊ตฌํ•ด ๋ฐ˜ํ™˜ํ•ด์คŒ.
return findMaxRequestCount(requests: appendRequests(lines: lines))
}
//์‹œ์ž‘์‹œ๊ฐ„์„ ๊ตฌํ•จ.
func calculateStartTime(line:String,end:Float) -> Float {
//์ฒ˜๋ฆฌ์‹œ๊ฐ„
var duringTime = line.split(separator: " ")[2]
//์ฒ˜๋ฆฌ์‹œ๊ฐ„์—์„œ s๋ฅผ ๋นผ์ค€๋‹ค.
duringTime.removeLast()
//๋์‹œ๊ฐ„์—์„œ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์„ ๋นผ๊ณ  0.001์„ ๋”ํ•ด์คŒ.
return end - Float(duringTime)! + 0.001
}
//๋์‹œ๊ฐ„์„ ๊ตฌํ•จ.
func calculateEndTime(line:String) -> Float {
//line์—์„œ ์‹œ๊ฐ„๋งŒ ๋ถ„๋ฆฌํ•ด์คŒ
let timeString = line.split(separator: " ")[1]
//์‹œ,๋ถ„,์ดˆ๋กœ ๋‚˜๋ˆ ์คŒ
let time = timeString.split(separator: ".")[0].split(separator: ":")
//์‹œ,๋ถ„,์ดˆ๋ฅผ ์ดˆ๋กœ ๋ณ€ํ™˜
let (h,m,s) = (Int(time[0])!*3600,Int(time[1])!*60,Int(time[2])!)
//์†Œ์ˆ˜์ 
let decimalPoint = timeString.split(separator: ".")[1]
//์ดˆ์™€ ์†Œ์ˆ˜์ ์„ ํ•ฉ์ณ์„œ ๋ฐ˜ํ™˜
return Float("\((h+m+s)).\(decimalPoint)")!
}
//์š”์ฒญ์˜ ์‹œ์ž‘๊ณผ ๋์„ ๋ชจ์•„์ค€๋‹ค.
func appendRequests(lines:[String]) -> [(Float,Float)] {
//์š”์ฒญ์˜ ์‹œ์ž‘๊ณผ ๋์„ ๋‹ด์„ ๋ณ€์ˆ˜
var requests = [(Float,Float)]()
//lines์„ ์ˆœํšŒ
lines.forEach{
//์š”์ฒญ์˜ ๋์‹œ๊ฐ„
let end = calculateEndTime(line: $0)
//์š”์ฒญ์˜ ์‹œ์ž‘์‹œ๊ฐ„
let start = calculateStartTime(line: $0, end: end)
//์‹œ์ž‘๊ณผ ๋์„ ํŠœํ”Œ๋กœ ๋‹ด์•„์„œ ๋„ฃ์–ด์คŒ. (end์‹œ๊ฐ„์— 1์„ ๋”ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” 1์ดˆ๊ฐ„์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ๋•Œ๋ฌธ)
requests.append((start,end + 1))
}
//์š”์ฒญ์„ ๋ฐ˜ํ™˜
return requests
}
//์ตœ๋Œ€์š”์ฒญ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•จ.
func findMaxRequestCount(requests:[(Float,Float)]) -> Int {
//์š”์ฒญ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์คŒ. ์ž๊ธฐ ์ž์‹ ์€ ํฌํ•จํ•˜๋‹ˆ 1์„ ๋„ฃ์–ด์คŒ
var counts = Array(repeating: 1, count: requests.count)
//์š”์ฒญ๋“ค์„ ์ˆœํšŒ
for (i,request) in requests.enumerated() {
//์š”์ฒญ๋“ค ์ค‘ i๋ฒˆ์งธ ์ดํ›„๋กœ ํ˜„์žฌ ์š”์ฒญ์˜ ๋๋ณด๋‹ค ์ž‘์€ ๊ฒƒ๋“ค์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋”ํ•ด์คŒ.
counts[i] += requests[(i+1)...].filter{request.1 > $0.0}.count
}
//๊ฐฏ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ตœ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜
return counts.max() ?? 0
}

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€