๋ฌธ์ ๋งํฌ ๐ https://programmers.co.kr/learn/courses/30/lessons/17676
๋ฌธ์ ์ดํด
์๋ต ์๋ฃ๋ ์๊ฐ ์ ๋ณด์ ์ฒ๋ฆฌ ์๊ฐ ์ ๋ณด๊ฐ (๋ ์ง ์ ๋ณด๋ ์ฃผ์ด์ง์ง๋ง ์๋ฏธ๊ฐ ์์) ๋ฐฐ์ด๋ก ์ฃผ์ด์ง๊ณ ์ด๋น ์ต๋ ์ฒ๋ฆฌ๋์ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค. ๋ฌธ์ ์ ๋งจ ์๋ ๋ถ๋ถ์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ์ด๋น ๊ฒน์น๋ ์ฒ๋ฆฌ๋ถ๋ถ์ด ์ต๋ ๋ช๊ฐ๋๋ฅผ ๊ตฌํด์ผ ํฉ๋๋ค.
๋ฌธ์ ํ์ด
์์ ๋ฅผ ๋ณด๊ณ ์ฒ์์ 0.001์ด ์์ซ์ ์ ์งธ ์ง๋ฆฌ๊น์ง ๊ณ์ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
1. 1000์ ๊ณฑํด์ ์์์ ์ ์ง์ฐ๊ณ ๊ณ์ฐํ๋ค.
2. swift์ DateFormatter ํด๋์ค์ Date ํ์ ์ timeIntervalSince ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์๊ฐ ๊ณ์ฐ์ ํ๋ค.
์ ๋ swift์ ์ฅ์ ์ ์ด๋ฆด ์ ์๋ ๋ฌธ์ ๊ฒ ๊ตฌ๋ ํ๋ฉฐ 2๋ฒ ๋ฐฉ๋ฒ์ ์ ํํ์๊ณ ๊ทธ ์ดํ๋ก ์ฝ์ง์ ์ ๋ง ๋ง์ด ํ์ต๋๋ค.
๋ ์ง์ ์๊ฐ(์,๋ถ,์ด)์ด ์ฃผ์ด์ง๊ณ ์์์๊ฐ๊ณผ ์๋ฃ์๊ฐ์ ๊ตฌํ๋๋ฐ, ์ด๋น ์ต๋ ์ฒ๋ฆฌ๋์ ๊ตฌํ๋ค๊ฐ ๋งํ๋ฒ๋ ธ์ต๋๋ค.
์ ํ ๊ฐ์ด ์ค์ง ์๋๋ผ๊ตฌ์.. ๊ทธ๋์ ์นด์นด์ค ํด์ค์ ๋ณด๊ณ ํ์ด ๋ฐฉํฅ์ ์ก์ ์ ์์์ต๋๋ค.
https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/
0.001 ๋จ์๋ก ๋ชจ๋ ์๊ฐ๋ง๋ค ์ฒ๋ฆฌ๋์ ์ ๋ถ ๊ณ์ฐ์ ํด๋ฒ๋ฆฌ๋ฉด,
1์ด๋ฅผ ๊ณ์ฐํ๋๋ฐ 1000๋ฒ์ ๋์ ๊ณ์ฐํด์ผํ๊ณ ์ด๊ฒ์ n๋ฒ ํ๋ฃจ๋์ ๊ณ์ฐ์ ํด์ผํฉ๋๋ค. (ํ๋ฃจ๋ผ๋ ๊ฒ์ ๋ฌธ์ ์กฐ๊ฑด์ ๋์์์)
ํ๋ฃจ * N * 1000
= 24 * 60 * 60 * 1000 * N
= 86400000 * N (1<=N<=2000)
๋ณด๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋์ฌ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์์ต๋๋ค.
๊ทธ๋ผ ๋ค์ ๋ฌธ์ ์ ๋งจ ์๋ ๋ถ๋ถ์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด,
์ฒ๋ฆฌ๋์ด ๋ณํ๋ ๋ถ๋ถ์ ์๋ต์ ์์ํ๋ ๋ถ๋ถ๊ณผ ์๋ฃํ๋ ๋ถ๋ถ ๋ ๊ตฐ๋ฐ ๋ฟ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ ๋ ๋ถ๋ถ์ ํ๋์ ์๋ต์ด๋ฏ๋ก ํ ๊ตฐ๋ฐ๋ง ๊ณ์ฐ์ ํด๋ ๋๋๋ฐ
์๋ฃ ์๊ฐ์ด ์ด๋ฏธ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ ๊ฒ์ ๋ณด์ ์๋ฃ ์๊ฐ๋ง ๊ณ ๋ คํ๋ฉด ๋๋ค๋ฅผ ์ ์ ์์ต๋๋ค.
๊ฐ ์๋ต ์๋ฃ ์๊ฐ๋ง๋ค ๋ชจ๋ ์๋ต ์๊ฐ์ ์์์๊ฐ์์ 1s๋งํผ์ ์๊ฐ์ ๋บ ์๊ฐ์ ๋น๊ตํ์ฌ์ ์๋ต ์๋ฃ ์๊ฐ์ด ํฌ๋ค๋ฉด ํฌํจํ๋ฉด ๋ฉ๋๋ค.
์๋ต๋ค์ ๊ฐ์๋ฅผ N์ด๋ผ ํ๋ฉด
๊ฐ ์๋ต๋ง๋ค ์๋ต๋ค์ ํ๋ฒ์ฉ ๋น๊ตํด๊ฐ๋ฉด ๋๋
N * N , ์๊ฐ ๋ณต์ก๋๋ O(N^2)๋ก ์์ ๊ฒฝ์ฐ๋ณด๋ค ํจ์ฌ ์ค๊ฒ ๋ฉ๋๋ค.
But,,
์ 2๋ฒ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ์์๋ ํ๊ธฐ ์์ํ์์ง๋ง ํ ์ผ 3๋ฒ๊ณผ 18๋ฒ์์ ๊ณ์ ์คํจ๊ฐ ๋ฌ์ต๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์ธ์ด๋ก ํผ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์๋๋ฐ 1๋ฒ๋ฐฉ๋ฒ์ ์ ํํ๋๋ผ๊ตฌ์. ๊ทธ๋์ ์ ๋ 1๋ฒ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๊ฟ๋ณด์๊ณ ํต๊ณผํ์ต๋๋ค.
2๋ฒ ๋ฐฉ๋ฒ์ด ์คํจํ ์ด์ ... ์์ง๋ ์ ํํ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ ๊ฐ ๋ด๋ฆฐ ๊ฒฐ๋ก ์ Dateํ์ ์ ์ด์ฉํ์ฌ ๊ณ์ฐํ๋ฉด ์์ซ์ ์ ์งธ์ง๋ฆฌ๋ฟ๋ง ์๋๋ผ ์์ซ์ ๋ท์งธ์๋ฆฌ, ๋ค์ฏ์งธ์๋ฆฌ.... 10๋ฒ์งธ ์๋ฆฌ๊น์ง ๋ ์ ๋ฐํ๊ฒ ๊ณ์ฐ์ด ๋์ 3๋ฒ๊ณผ 18๋ฒ์์ ์ค๋ฅ ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ์๋ ์๋ ์์ต๋๋ค.
์ฝ๋
๋ฌธ์ ํ์ฑํด์ ์๋ต ์์ ์๊ฐ๊ณผ ์๋ต ์๋ฃ ์๊ฐ ๊ตฌํ๊ธฐ
์๊ฐ ์ ๋ณด๊ฐ ๋ ์ง ์ ๋ณด์ ์์ฌ ์์ผ๋ฏ๋ก ์ ์ ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด ํ์ฑํด์ฃผ์ด์ผ ํฉ๋๋ค.
๋ฌธ์์ด ์ชผ๊ฐ๋ ๋ฐฉ๋ฒ! ๐ 2022.01.15 - [iOS] - [Swift] String Index
ํ์ฑํด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ lines๋ฐฐ์ด์์ ์ํ๋ ์์น์ ์ ๋ณด๋ฅผ ๋นผ๋ด ์๋ต ์์ ์๊ฐ startIntTime๊ณผ ์๋ต ์๋ฃ ์๊ฐ endIntTime์ ๊ตฌํฉ๋๋ค. ๋ฐ๋ฆฌ์ธ์ปจ๋๋ ์ฝ๊ฒ ๊ณ์ฐํด์ฃผ๊ธฐ์ํด ์๋ถ์ด๋ฅผ 1000์ ๊ณฑํ๊ณ ๋ฐ๋ฆฌ์ธ์ปจ๋๋ ์ผ์์๋ฆฌ๋ถํฐ ๋ฐฑ์์๋ฆฌ๋ก ๊ณ์ฐํฉ๋๋ค.
์ฒ๋ฆฌ์๊ฐ์ ์์์๊ฐ๊ณผ ๋์๊ฐ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์๋ต ์์ ์๊ฐ์ ๊ณ์ฐํ ๋ 1์ ๋ํด์ฃผ์ด์ผ ํฉ๋๋ค. (์๋๋ 0.001์ ๋ํด์ผํ๋๋ฐ ์์ซ์ ์ ์์ ์คฌ๊ธฐ ๋๋ฌธ์ 1์ ๋๋ค.)
func getString(original: String, from: Int, to: Int) -> String {
let startIndex = original.startIndex
let start = original.index(startIndex, offsetBy: from)
let end = original.index(startIndex, offsetBy: to)
return String(original[start...end])
}
var endIntTime = [Int]()
var startIntTime = [Int]()
lines.forEach {
let strings = $0.split(separator: " ")
let strings1 = String(strings[1])
let hour = Int(getString(original: strings1, from: 0, to: 1))!
let minute = Int(getString(original: strings1, from: 3, to: 4))!
let second = Int(getString(original: strings1, from: 6, to: 7))!
let millisecond = Int(getString(original: strings1, from: 9, to: 11))!
let timeInt: Int = (hour * 3600 + minute * 60 + second) * 1000 + millisecond
endIntTime.append(timeInt)
var strings2 = String(strings[2])
strings2.removeLast()
startIntTime.append(timeInt - Int(Double(strings2)! * 1000) + 1)
}
์๋ต ์๋ฃ ์์ ๋ง๋ค ์ฒ๋ฆฌ๋ ๊ณ์ฐํ๊ธฐ
์๋ฃ ์์ ๋ง๋ค ๋ชจ๋ ์๋ต๋ค์ ์์ ์๊ฐ - 1000(1์ด)๋ฅผ ๋น๊ตํ์ฌ ํฌ๋ค๋ฉด ์๋ต์ด ์ฒ๋ฆฌ๋๋ค๊ณ ์๊ฐํ๊ณ ๋ํด์ฃผ์์ต๋๋ค. ์ฌ๊ธฐ์ ํฌ๊ฑฐ๋ ๊ฐ๋ค๊ฐ ์๋๋ผ ํฌ๋ค์ธ ์ด์ ๋ ์ฒ๋ฆฌ ์๊ฐ์ ์์ ์๊ฐ๋ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ๋ค๋ฉด ์์ ์๊ฐ + 1 ๋ถํฐ ์๋ต์ด ์์ ๋๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌํ๋ฉด ์๋ฉ๋๋ค.
var maxResult: Int = 0
for i in 0...lines.count-1 {
var count = 0
let currentTime = endIntTime[i]
for j in i...lines.count-1 {
if currentTime > startIntTime[j] - 1000 {
count += 1
}
}
maxResult = max(maxResult, count)
}
์ ์ฒด ์ฝ๋
import Foundation
func getString(original: String, from: Int, to: Int) -> String {
let startIndex = original.startIndex
let start = original.index(startIndex, offsetBy: from)
let end = original.index(startIndex, offsetBy: to)
return String(original[start...end])
}
func solution(_ lines:[String]) -> Int {
var endIntTime = [Int]()
var startIntTime = [Int]()
lines.forEach {
let strings = $0.split(separator: " ")
let strings1 = String(strings[1])
let hour = Int(getString(original: strings1, from: 0, to: 1))!
let minute = Int(getString(original: strings1, from: 3, to: 4))!
let second = Int(getString(original: strings1, from: 6, to: 7))!
let millisecond = Int(getString(original: strings1, from: 9, to: 11))!
let timeInt: Int = (hour * 3600 + minute * 60 + second) * 1000 + millisecond
endIntTime.append(timeInt)
var strings2 = String(strings[2])
strings2.removeLast()
startIntTime.append(timeInt - Int(Double(strings2)! * 1000) + 1)
}
var maxResult: Int = 0
for i in 0...lines.count-1 {
var count = 0
let currentTime = endIntTime[i]
for j in i...lines.count-1 {
if currentTime > startIntTime[j] - 1000 {
count += 1
}
}
maxResult = max(maxResult, count)
}
return maxResult
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] n์ง์ ๊ฒ์ (0) | 2022.02.06 |
---|---|
[Programmers] ๊ฑฐ๋ฆฌ๋๊ธฐ ํ์ธํ๊ธฐ (0) | 2022.02.04 |
[Programmers] ๋ฌธ์์ด ์์ถ (0) | 2022.02.01 |
[Baekjoon] 1021 ํ์ ํ๋ ํ (0) | 2022.01.12 |
[Swift] Union-Find ์๋ฃ๊ตฌ์กฐ ๊ตฌํํด๋ณด๊ธฐ (0) | 2022.01.08 |