๋ฐ์ํ
๋ฌธ์ ๋งํฌ
https://programmers.co.kr/learn/courses/30/lessons/92341
๋ฌธ์ ํด์ ๋ฐ ํ์ด
- fees ์์ ์ฒซ๋ฒ์งธ๋ ๊ธฐ๋ณธ ์ฃผ์ฐจ ์๊ฐ, ๋๋ฒ์งธ๋ ๊ธฐ๋ณธ ์ฃผ์ฐจ ์๊ธ, ์ธ๋ฒ์งธ๋ ์ฃผ์ฐจ์๊ธ์ ๊ณ์ฐํ๋ ๋จ์ (๋ถ), ๋ค๋ฒ์งธ๋ ๋จ์๋น ์ผ๋ง?๋ฅผ ์๋ฏธํ๋ค.
- records์์ "__" ์ด ํ ๋ฐ์ดํ๋ฅผ " " ๊ณต๋ฐฑ์ผ๋ก ๋๋์ด ๋ฒํธํ๊ณผ ์
์ถ์ฐจ์๊ฐ์ ๊ตฌ๋ณํด์ฃผ๋ ๊ฒ์ด ํ์ํ๋ค.
- ์๊ฐํด๋ณด๋ฉด IN ๊ณผ OUT ์ ๊ทธ๋ฅ ์ค์ํ์ง ์๋ค. ์ด์ฐจํผ records๋ ์๊ฐ์์๋๋ก ์ ๋ ฌ๋์ด ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์, IN๋ค์์ ๋ฌด์กฐ๊ฑด OUT์ผ ๊ฒ์ด๋ค. ์ด ๊ฐ๋ ๋๋ก ์๊ฐํด๋ณด๋ฉด, records์์ ๋ฒํธํ 0000์ ์ ์ถ์ฐจ์๊ฐ ๊ธฐ๋ก ๊ฐฏ์๊ฐ ํ์๊ฐ์ด๋ฉด, OUT ๊ธฐ๋ก์ด ์๋ ๊ฒ์ด๋ผ๊ณ ํ๋จํ ์ ์๋ค. ๊ทธ๋ผ ๊ฐฏ์๊ฐ ํ์์ธ ๊ฒ์๋ง append("23:59")๋ฅผ ํด์ฃผ๋ฉด ๋ ๊ฒ์ด๋ค!
- ์ฃผ์ํด์ผํ ์กฐ๊ฑด ์ค ํ๋๊ฐ, ๋ฒํธํ ์ค๋ฆ์ฐจ์ ์์๋๋ก ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํด์ผํ๋ค๋ ๊ฒ์ด๋ค.
- "๋ฒํธํ ๋ณ"๋ก ์ ์ถ์ฐจ๋ฅผ ๊ตฌ๋ถํด์ผํ๊ธฐ ๋๋ฌธ์, dictionary๋ฅผ ์ด์ฉํด์ ํ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
1. ํ์ํ ๋ณ์ ๋ฐ dictionary ์ ์
- records์์ ์ ๋ ฅ๋ฐ์ ํ๋์ฉ ํ๋์ฉ์ for๋ฌธ์ ํตํด ๋๋ฆฌ๋ฉด์ dictionary์ ๋ฃ์ด์ค๋ค.
- temp์๋ record๋ฅผ ๋์ด์ฐ๊ธฐ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ์งค๋ผ์ ๋ฃ๋๋ค.
- ์์ ์ฌ์ง์์ ์ ์ถ๋ ฅ ๋งจ ์ฒซ๋ฒ์งธ records๋ฅผ ์์๋ก ๋ค๋ฉด, ["05:34", "5961", "IN"] ์ด๋ ๊ฒ ์ ์ฅ๋ ๊ฒ์ด๋ค.
- recordDic์๋ key ๊ฐ์ int๋ก, value๋ int ๋ฐฐ์ด ํ์์ผ๋ก ๋ฐ์ ๊ฒ์ด๋ค.
- [์ฐจ๋๋ฒํธ: [์ ์ฐจ์๊ฐ, ์ถ์ฐจ์๊ฐ, ์ ์ฐจ์๊ฐ]] ์ด๋ ๊ฒ ํ ์์ ์ด๋ค.
- if ๋ฌธ์ ํตํด์, carName์ ์ ๋ฌด๋ฅผ ํ์ธํ ๋ค, ์๋ค๋ฉด key:value๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ์๋ค๋ฉด value.append() ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๋ฃ์ด์ค ์ ์๋ค.
let basicTime = fees[0]
let basicFee = fees[1]
let perTime = fees[2] // ๋จ์ ์๊ฐ
let perFee = fees[3] //๋จ์์๊ธ
var result: [[Int]] = []
var recordDic: [Int: [Int]] = [:]
for record in records {
let temp = record.split(separator: " ").map{ String($0) }
let carName = Int(temp[1])!
if recordDic[carName] == nil {
recordDic[carName] = [calculateTime(time: temp[0])]
} else {
recordDic[carName]!.append(calculateTime(time: temp[0]))
}
}
2. recordDic ์์ ์ถ์ฐจ์๊ฐ - ์ ์ฐจ์๊ฐ ๊ณ์ฐํด์ฃผ๊ธฐ
- ์ฌ๊ธฐ์ ์ ์๋ ๊ธ์ก์ ์ ๋ถ '๋ถ'๋จ์๋ก ๊ณ์ฐ๋๋ค.
- ๋ฐ๋ผ์ ์
์ถ์ฐจ์๊ฐ์ ๋ชจ๋ ๋ถ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค.
- time์๋ stringํํ๋ก ๊ฐ์ ๋ฐ๋๋ค. "23:59" ์ด๋ฐ ํํ
- ํด๋น ์๊ฐ์ ":" ๋ฅผ ๊ธฐ์ค์ผ๋ก ์งค๋ผ์, 23๊ณผ 59๋ก ๋๋๋ค.
- 23์ hour์ด๊ธฐ ๋๋ฌธ์ 60์ ๊ณฑํด์ฃผ๊ณ , 59๋ ๊ทธ๋ฅ ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๋๋๋ค.
- ํด๋น ๋ ๊ฐ์ ๋ํด์ฃผ๋ฉด, 23:59์ด ๋ถ์ผ๋ก ํํ๋๋ค.
func calculateTime(time: String) -> Int {
let tempTime = time.split(separator: ":").map{Int(String($0))!}
return tempTime[0]*60 + tempTime[1]
}
- recordDic์์ ์ถ์ฐจ์๊ฐ - ์ ์ฐจ์๊ฐ์ ๊ณ์ฐํด์ฃผ๊ธฐ ์ํด์ for๋ฌธ์ ๋๋ฆฐ๋ค.
- ์ฒ์ for๋ฌธ์ ๋๋ฆฌ๊ธฐ ์ ์, value์ ๊ฐฏ์๋ฅผ ์ธ์ด์ out์๊ฐ์ด ์กด์ฌํ์ง ์๋ ๊ฒ๋ค์๊ฒ๋ "23:59"๋ฅผ ์ถ๊ฐํด์ฃผ๋ ์์ ์ ๊ฑฐ์น๋ค.
- while๋ฌธ ์ค๋ช
- nowIdx๋ฅผ 1๋ก ์ค์ ํด์ฃผ๊ณ , 2์ฉ ๋ํด์ฃผ๋ฉด์ ์ถ์ฐจ์๊ฐ - ์ ์ฐจ์๊ฐ ์ ๊ณ์ฐํด์ค๋ค.
- 2๋ฅผ ๋ํ๋ ์ด์ ๋, ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด์๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค ๋ฒํธ 1, 3, 5,,, ์์น์ ์๋ ๊ฐ๋ค์ด ์ถ์ฐจ์๊ฐ์ผ ๊ฒ์ด๋ค. ๊ทธ๋์ 2์ฉ ๋ํด์ฃผ๋ฉด์, ํ์นธ ์์์๋ ์ ์ฐจ์๊ฐ์ ๋นผ์ค๋ค.
- while ๋ฌธ์ด ๋๋๋ฉด result์ ์๋์ฐจ ๋ฒํธํ์ ๊ฐ๋ฅดํค๋ key์ ๊ณ์ฐ๋์ด ๋์จ ์ฃผ์ฐจ์๊ฐ(resultTotalTime)์ [result]์ ๋ฃ์ด์ค๋ค.
- 2์ฐจ์ ๋ฐฐ์ด๋ก ํ ์ด์ ๋, ๋์ค์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ผ ๋ "์ฐจ๋ ๋ฒํธํ" ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํด์ผํ๊ธฐ ๋๋ฌธ์, ๊ตฌ๋ถ์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
for (key, value) in recordDic {
var resultTotalTime = 0
var nowIdx = 1
var tempValue: [Int] = value
// out์ด ์๋ ๊ฒฝ์ฐ 23์ 59๋ถ ์ถ๊ฐ
if value.count % 2 != 0 {
tempValue.append(calculateTime(time: "23:59"))
}
// 2, 4, 6,,, ๋ฒ์งธ์์ ์๊บผ ๋นผ๊ธฐ
while nowIdx < tempValue.count {
let calTime = tempValue[nowIdx] - tempValue[nowIdx-1]
resultTotalTime += calTime
nowIdx += 2
}
result.append([key, resultTotalTime])
}
3. ์ต์ข ์ฃผ์ฐจ๋น ๊ณ์ฐ
- ์ต์ข ์ฃผ์ฐจ๋น๋ฅผ ๊ณ์ฐํ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค.
- total ํ์์ด ๊ธฐ๋ณธ ์ ๊ณตํ๋ ์ฃผ์ฐจ์๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด, ์ฐจ๋ฅผ ๊ตฌํ๊ณ , ์๋๋ผ๋ฉด ๊ณ์ฐํ ์ฃผ์ฐจ์๊ฐ์ 0์ด๋๋ค.
- basicFee๋ ํ์์ ์ผ๋ก ๋ด์ผํ๋ ๊ธ์ก์ด๊ธฐ ๋๋ฌธ์, result์ ๊ณ์ผ๋ ๊ธ์ก๋ค์ ๋ํด์ฃผ๋ ํ์์ผ๋ก ๊ตฌ์ฑํ๋ค.
func calculateResult(basicFee: Int, basicTime: Int, perFee: Int, perTime: Int,arr: [Int]) -> Int {
var total = arr[1]
var result = basicFee
// ๊ธฐ๋ณธ ์๊ฐ์ ๋บ ์ฃผ์ฐจ์๊ธ์ ๋ผ ์๊ฐ ๊ตฌํ๊ธฐ
if total > basicTime {
total = total - basicTime
} else {
total = 0
}
if total > 0 {
if total % perTime != 0 {
result += Int((total / perTime + 1) * perFee)
} else {
result += Int(total / perTime * perFee)
}
}
return result
}
- ์ต์ข
์ ์ผ๋ก ๊ตฌ์ฑ๋ result ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- [[์ฐจ๋๋ฒํธ, ๊ธ์ก], [์ฐจ๋๋ฒํธ, ๊ธ์ก]....]
- ์ด ๋ฆฌ์คํธ๋ฅผ, ์ฐจ๋๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ํ, ๊ธ์ก๋ค์ ์ถ๋ ฅํด์ผํ๋ค.
- ์ฐจ๋๋ฒํธ, ๊ทธ๋๊น ์ธ๋ฑ์ค 0๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ์ฝ๋๋ ์ธํฐ๋ท์ ์ฐธ๊ณ ํด์ ํ์๋ค. (์์๋๋ฉด ์ข์๋ฏ!)
let realResult = result.sorted(by: {$0[0] < $1[0]})
var returnValue: [Int] = []
for i in 0..<realResult.count {
returnValue.append(calculateResult(basicFee: basicFee, basicTime: basicTime, perFee: perFee, perTime: perTime, arr: realResult[i]))
}
์ต์ข ์ฝ๋
func solution(_ fees:[Int], _ records:[String]) -> [Int] {
let basicTime = fees[0]
let basicFee = fees[1]
let perTime = fees[2] // ๋จ์ ์๊ฐ
let perFee = fees[3] //๋จ์์๊ธ
var result: [[Int]] = []
var recordDic: [Int: [Int]] = [:]
for record in records {
let temp = record.split(separator: " ").map{ String($0) }
let carName = Int(temp[1])!
if recordDic[carName] == nil {
recordDic[carName] = [calculateTime(time: temp[0])]
} else {
recordDic[carName]!.append(calculateTime(time: temp[0]))
}
}
for (key, value) in recordDic {
var resultTotalTime = 0
var nowIdx = 1
var tempValue: [Int] = value
// out์ด ์๋ ๊ฒฝ์ฐ 23์ 59๋ถ ์ถ๊ฐ
if value.count % 2 != 0 {
tempValue.append(calculateTime(time: "23:59"))
}
// 2, 4, 6,,, ๋ฒ์งธ์์ ์๊บผ ๋นผ๊ธฐ
while nowIdx < tempValue.count {
let calTime = tempValue[nowIdx] - tempValue[nowIdx-1]
resultTotalTime += calTime
nowIdx += 2
}
result.append([key, resultTotalTime])
}
let realResult = result.sorted(by: {$0[0] < $1[0]})
var returnValue: [Int] = []
for i in 0..<realResult.count {
returnValue.append(calculateResult(basicFee: basicFee, basicTime: basicTime, perFee: perFee, perTime: perTime, arr: realResult[i]))
}
return returnValue
}
func calculateTime(time: String) -> Int {
let tempTime = time.split(separator: ":").map{Int(String($0))!}
return tempTime[0]*60 + tempTime[1]
}
func calculateResult(basicFee: Int, basicTime: Int, perFee: Int, perTime: Int,arr: [Int]) -> Int {
var total = arr[1]
var result = basicFee
// ๊ธฐ๋ณธ ์๊ฐ์ ๋บ ์ฃผ์ฐจ์๊ธ์ ๋ผ ์๊ฐ ๊ตฌํ๊ธฐ
if total > basicTime {
total = total - basicTime
} else {
total = 0
}
if total > 0 {
if total % perTime != 0 {
result += Int((total / perTime + 1) * perFee)
} else {
result += Int(total / perTime * perFee)
}
}
return result
}
๋ฐ์ํ
'Algorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) kakao - ์คํจ์จ (2019 KAKAO BLIND RECRUITMENT) (0) | 2022.08.07 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) Kakao - ๋ฉ๋ด ๋ฆฌ๋ด์ผ (0) | 2022.05.12 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) Kakao ์ ๊ณ ๊ฒฐ๊ณผ ๋ฐ๊ธฐ (0) | 2022.04.29 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) Kakao ํฌ๋ ์ธ ์ธํ๋ฝ๊ธฐ ๊ฒ์ (0) | 2022.04.28 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์ด๋ถํ์ - ์ง๊ฒ๋ค๋ฆฌ (ํ์ด์ฌ) (2) | 2021.10.14 |