티스토리 뷰
728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/17676
ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 문제를 잘 읽어야 3번 케이스를 풀 수 있어요..(근데 어제 무슨일이 있던거지.. 투데이가 엄청 많네..)
초당 최대 처리량: 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수
입력 형식
solution
함수에 전달되는lines
배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.- 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이
2016-09-15 hh:mm:ss.sss
형식으로 되어 있다. - 처리시간 T는
0.1s
,0.312s
,2s
와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는s
로 끝난다. - 예를 들어, 로그 문자열
2016-09-15 03:10:33.020 0.011s
은 2016년 9월 15일 오전 3시 10분 33.010초부터 2016년 9월 15일 오전 3시 10분 33.020초까지 0.011초 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함) - 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.
lines
배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.
출력 형식
solution
함수에서는 로그 데이터lines
배열에 대해 초당 최대 처리량을 리턴한다.
예제를 보면 이해가 된다.
예제2
- 입력: [
2016-09-15 01:00:04.002 2.0s,
2016-09-15 01:00:07.000 2s
] - 출력: 2
- 설명: 처리시간은 시작시간과 끝시간을 포함하므로
첫 번째 로그는01:00:02.003 ~ 01:00:04.002
에서 2초 동안 처리되었으며,
두 번째 로그는01:00:05.001 ~ 01:00:07.000
에서 2초 동안 처리된다.
따라서, 첫 번째 로그가 끝나는 시점과 두 번째 로그가 시작하는 시점의 구간인01:00:04.002 ~ 01:00:05.001
1초 동안 최대 2개가 된다.
주의할점!(케이스3번)
- 입력값은 끝난시간이다.
- 시작시간을 구할려면 끝난시간 - 지속시간 + 0.001초를 해줘야 한다! 0.001초는 초 세는 방법에서 차이가 생김으로 더해줘야 한다!
- ㅠㅠㅠㅠ 1초 후 시간 역시 0.001초가 모자람으로 1초를 더해주는게 아니라 0.999초를 더해줘야한다..
접근방법
시작시간과 끝난시간을 구해준다. -> dateFormatter 사용 ㅇ_ㅇ
1초동안 걸리는 갯수의 최댓값임으로.. 0.001초 단위로 서치할 순 없으니..
최댓값임으로 1 이상값이여야 한다. 입력값이 1개 이상이니..?
그러므로 시작시간 ~ 시작시간+1초 사이에 몇개가 있는지랑
끝난시간 ~ 끝난시간+1초 사이에 몇개가 있는지를 구하면
최댓값을 구할 수 있다.(이렇게 해야 한개 이상은 걸리기 때문..)
1초 더해줄 때 0.999초 더해주는것 잊지말자..(이것때문에 고생했다..)
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
func solution(_ lines:[String]) -> Int { | |
var max = 1 | |
var log: [[Date]] = Array(repeating: [], count: lines.count) | |
let df = DateFormatter() | |
df.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS" | |
df.calendar = Calendar(identifier: .iso8601) | |
df.timeZone = TimeZone(secondsFromGMT: 0) | |
df.locale = Locale(identifier: "ko_kr") | |
for (i, line) in lines.enumerated() { | |
let ipt = line.split(separator: " ").map{String($0)} | |
let during = Double(ipt[2][..<ipt[2].index(ipt[2].endIndex, offsetBy: -1)])! | |
var date = df.date(from: "\(ipt[0]) \(ipt[1])")! // endTime | |
log[i].append(date) | |
date.addTimeInterval(0.001-during) | |
log[i].append(date) | |
} | |
for i in 0 ..< log.count-1 { | |
var ct = 1 | |
let a시작 = log[i][1] | |
var a시작후1초 = log[i][1] | |
a시작후1초.addTimeInterval(0.999) // 이게 1초 후임.. | |
for j in i+1 ..< log.count { // 불필요한부분 뺴기 위해 i+1부터 시작 | |
let b시작 = log[j][1] | |
let b끝 = log[j][0] | |
if (b시작 >= a시작 && b시작 < a시작후1초) || (b끝 >= a시작 && b끝 < a시작후1초) || (b시작 <= a시작 && b끝 >= a시작후1초) { ct += 1} | |
} | |
if max < ct { max = ct } | |
} | |
for i in 0 ..< log.count-1 { | |
var ct = 1 | |
let a끝 = log[i][0] | |
var a끝후1초 = log[i][0] | |
a끝후1초.addTimeInterval(0.999) | |
for j in i+1 ..< log.count { // 불필요한부분 뺴기 위해 i+1부터 시작 | |
let b시작 = log[j][1] | |
let b끝 = log[j][0] | |
if (b시작 >= a끝 && b시작 < a끝후1초) || (b끝 >= a끝 && b끝 < a끝후1초) || (b시작 <= a끝 && b끝 >= a끝후1초) { ct += 1 } | |
} | |
if max < ct { max = ct } | |
} | |
return max | |
} |
더 좋은 풀이
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 확인할 코드 | |
import Foundation | |
struct Process: Equatable, Comparable { | |
var num: Int | |
var start: Double | |
var end: Double | |
var duration: Double | |
init(_ s: String, _ n: Int) { | |
self.num = n | |
let ss = s.split(separator: " ") | |
let format = DateFormatter() | |
format.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS" | |
let ns = "\(ss[0]) \(ss[1])" | |
let d = format.date(from: ns)! | |
self.duration = Double(ss[2].replacingOccurrences(of: "s", with: ""))! | |
self.end = d.timeIntervalSinceReferenceDate | |
self.start = end - duration + 0.001 | |
} | |
static func <(lhs: Process, rhs: Process) -> Bool { | |
return lhs.start < rhs.start | |
} | |
static func == (lhs: Process, rhs: Process) -> Bool { | |
return lhs.num == rhs.num | |
} | |
} | |
func solution(_ lines:[String]) -> Int { | |
var ps = lines.reduce(into: [Process](), { ary, s in | |
ary.append(Process(s, ary.count)) | |
}) | |
ps.sort() | |
var mx = 1 | |
var lastCheckRangeStart = ps[0].start - 3.1 | |
for i in 0..<ps.count-1 { | |
let c = ps[i] | |
var rangeStart = c.start; // initial position of checking start position.. | |
while rangeStart <= c.end { | |
if lastCheckRangeStart < rangeStart { // if not checked this range | |
lastCheckRangeStart = rangeStart // update last check range position | |
let rangeEnd = rangeStart + 1.0 | |
var cnt = 1 | |
for j in i+1..<ps.count { | |
let nxt = ps[j] | |
if rangeEnd < nxt.start{ // no need to check | |
break | |
} | |
if rangeStart...rangeEnd ~= nxt.start || rangeStart...rangeEnd ~= nxt.end | |
|| nxt.start...nxt.end ~= rangeStart || nxt.start...nxt.end ~= rangeEnd { | |
cnt += 1 | |
} | |
} | |
mx = max(mx, cnt) | |
} | |
rangeStart += 0.001 | |
} // end of while statement | |
} | |
return mx | |
} |
728x90
'개발 블로그 > 알고리즘' 카테고리의 다른 글
[Swift] 프로그래머스 - N으로 표현 (0) | 2020.11.06 |
---|---|
Swift 파일입출력 코드 (0) | 2020.11.06 |
[Swift] 백준 - 신입 사원 (0) | 2020.11.04 |
[Swift] 프로그래머스 - n진수 게임 (0) | 2020.11.03 |
[Swift] 프로그래머스 - 파일명 정렬 (0) | 2020.11.03 |
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 신입사원
- 아키택처
- 1차 뉴스 클러스터링
- Widget
- 카카오 블라인드 2018
- Github Search
- 카카오 블라인드2018
- Swift
- 카카오블라인드2018
- 백준 1946
- TransitionStyle
- VIPER 패턴
- 프로그래머스 추석트래픽
- BaseViewController
- ios
- UIModalPresentationStyle
- presentStyle
- 위젯
- Level 3
- 괄호연산
- RxDataSource
- BaseTableViewController
- 자기PR
- 프로그래머스 오픈채팅방
- today extension
- 프로그래머스 캐시
- Stack
- RxSwift
- ReactorKit
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함