์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- dfs
- ๊ธฐ์ด๋ฌธ๋ฒ
- ๋์ ๊ณํ๋ฒ
- BFS
- Til
- duno
- URLSession
- SQL
- GroupBy
- Swift
- SwiftUI
- ๊ณ ๋์ kit
- APPJAM
- SOPT
- SwiftUI ํํ ๋ฆฌ์ผ
- DynamicProgramming
- 0์ด๋์ด์๋๊ธธ
- HAVIT
- ์ด์งํ์
- SwiftUI Tutorials
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ฐ์ํ์ค๋ถ๋ถ์์ด์ํฉ
- algoritm
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- IOS
- binarySearch
- concurrency
- discardableResult
- algorithm
- GCD
- Today
- Total
suvera-dev ๐ฅฆ
20230401 TIL ๋ณธ๋ฌธ
์ค๋์ ๋ ์จ๊ฐ ๋๋ฌด ์ข์์
์ฐ์ฑ ์ ์๋ฉ ํ์ต๋๋ค. ๊ฝ๊ตฌ๊ฒฝ๋ ํ๊ณ ~..
๊ทธ๋๋ ๋ฆ๊ฒ ๋๋ง ๋ถ๋ด๋ถ๋ด ์คํฐ๋ ์นดํ ์์ด์.
1. ํ๋ก๊ทธ๋๋จธ์ค - ๋ ๋ฐ๋จน๊ธฐ
- DP ๋ฌธ์ ์์ต๋๋ค. DP๋ ์ญ์ ์ ํ์ ์ฐพ๋๊ฒ ๊ฝค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ค์..
- ์ฒ์์๋ DFS๋ BFS๋ก ํ์ด๋ณด๋ ค๊ณ ํ๋๋ฐ ํ์ ์ต๋ ์๊ฐ 10๋ง์ด๋ผ, ๋ฌด์กฐ๊ฑด ์๊ฐ์ด๊ณผ..ใ
- ์ฌ๊ณ ๋ ฅ(?)์ ๋ ๊ธธ๋ฌ์ผํ๋๋ฐ ๋จ๊ธฐ๊ฐ์ ๋๋๊ฒ ์๋๋ผ ์ฝ์ง์๋ค์ ใ ใ ใ ๋ฟ์ฅ
func solution(_ land:[[Int]]) -> Int{
// dp
var dp = land
for i in 1..<land.count {
for j in 0..<4 {
for k in 0..<4 {
if j == k { continue } // ๊ฐ์ ์ด์ ๊ฑด๋๋ฐ๊ธฐ
// 5์ ๋ค๊ฐ 2, 3, 5 ๋ํ ๊ฒ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐฑ์ ํ๊ฒ ๋จ.
dp[i][j] = max(dp[i][j], dp[i-1][k] + land[i][j])
}
}
}
return dp.last!.max()!
}
๋ค๋ฅธํ์ด์์ ์๋ ํ์ด๋ ๋ฐ๊ฒฌํ๋๋ฐ์ !
๋ฑ ๋ดค์๋ DP ๋ฐ๋ณต๋ฌธ์ด ์ดํด ์๋๋ค๋ฉด ์ด ์ฝ๋๋ก ํ๋์ฉ ์ดํดํด๋ณผ ์ ์์ ๊ฒ ๊ฐ์์
๋ค์ ํ์ 0๋ฒ์งธ ์ด์๋ ์ด์ ํ์ 1๋ฒ์งธ , 2๋ฒ์งธ, 3๋ฒ์งธ ์ด์ ๊ฐ๋ค ์ค์
๊ฐ์ฅ ํฐ ๊ฐ์ ๋ํด์ฃผ๋ฉด์ ์ต๋๊ฐ์ ๊ตฌํด์ฃผ๋ ๋ฐฉ์์ ๋๋ค !
( 0๋ฒ์งธ ์ด์ ์ด์ฐจํผ ๊ฐ์ ์ด์ด๋ผ ์ ์ธ๋จ. )
func solution(_ land:[[Int]]) -> Int{
var answer = 0
var land = land
for i in 0..<(land.count-1) {
land[i+1][0] += max(land[i][1], land[i][2], land[i][3])
land[i+1][1] += max(land[i][0], land[i][2], land[i][3])
land[i+1][2] += max(land[i][0], land[i][1], land[i][3])
land[i+1][3] += max(land[i][0], land[i][1], land[i][2])
}
guard let last = land.last else { return 0 }
return max(last[0],last[1], last[2], last[3])
}
2. ํ๋ก๊ทธ๋๋จธ์ค - ์คํ์ฑํ ๋ฐฉ
- ๊ธฐ์กด ํ์ด
func ํ์๋๋ฐ์๊ฐ์ด๊ณผ๋๋์คํ์ฑํ
๋ฐฉ(_ record:[String]) -> [String] {
var NicknameDic: [String: String] = [:]
var chatState: [(id: String, nickname: String, state: String)] = []
for i in record {
let input = i.split(separator: " ").map { String($0) }
let (state, id) = (input[0], input[1])
switch state {
case "Enter":
let nickname = input[2]
if NicknameDic[id] != nil {
// ๊ธฐ์กด์ ๋๋ค์์ด ์๋๋ฐ, ์ด๋ฆ ๋ฐ๊พธ๊ณ ๋ค์ด์ด ๋ฐ๊ฟ์ค๋ค.
NicknameDic[id] = nickname
chatState.indices.filter { chatState[$0].id == id }.forEach { chatState[$0].nickname = nickname }
} else {
// ์์ผ๋ฉด ์ถ๊ฐํด์ค๋ค.
NicknameDic[id] = nickname
}
chatState.append((id: id, nickname: nickname, state: "๋ค์ด์์ต๋๋ค"))
case "Leave":
let leaveName = NicknameDic[id]!
chatState.append((id: id, nickname: leaveName, state: "๋๊ฐ์ต๋๋ค"))
case "Change":
let changeName = input[2]
NicknameDic[id]! = changeName
chatState.indices.filter { chatState[$0].id == id }.forEach { chatState[$0].nickname = changeName }
default:
break
}
}
var result: [String] = []
for i in chatState {
result.append("\(i.nickname)๋์ด \(i.state).")
}
return result
}
- ์ฒ์์๋ ์ฑํ ๋ฐฉ ์ํ๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค๊ณ ๋๋ค์์ด ๋ฐ๋ ๋๋ง๋ค ๋ฐฐ์ด์์ indices ๋ฉ์๋๋ฅผ ํธ์ถํด์ id๋ ์ผ์นํ๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ณ ,
์ดํ์ ๊ฐ๊ฐ์ ์ธ๋ฑ์ค์ ๋ํด ๋ฐฐ์ด ์์๋ฅผ ์ ๋ฐ์ดํธ ํด์คฌ๋๋ฐ์.
- ์ด๋ ๊ฒ ํ๊ฒ ๋๋๊น ์ต๋ O(n^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋์ด 4๊ฐ์ ๋์ ํ ์ผ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋๋๋ผ๊ตฌ์.
- ๊ทธ๋์ ์ด๋ป๊ฒ ๊ฐ์ ์ ํด๋ณผ๊น ๊ณ ๋ฏผํ๋ค๊ฐ, ๋์ ๋๋ฆฌ๋ฅผ ์ฐ๋ ค๊ณ ํ๋๋ฐ ๊ทธ๋ฌ๋ฉด ์ฑํ ๋ฐฉ ๋ค์ด์จ ์์๋ ๊ผฌ์ด๊ฒ ๋๊ณ .. ํ์ฉํ๋๊ฒ ๋ณต์กํด์ง ๊ฒ ๊ฐ์์ ๋ฐฐ์ด์ ์ด์ฉํ๋ฉด์ ์ต๋ํ ๋ฐฐ์ด์ ๋ ๋ณ๊ฒฝํ๋ ์์ผ๋ก ๊ฐ์ ์ ํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๊ณฐ๊ณฐํ ์๊ฐํด๋ณด๋, ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฐ๋ ๋๋ค์๋ง ์๋ฉด๋๋๊น ๋๋ค์์ด ๋ฐ๋ ๋๋ง๋ค ๊ตณ์ด ์ ๋ฐ์ดํธ๋ฅผ ํด์ฃผ์ง ์์๋ ๋๋๋ผ๊ตฌ์
- ๋๋ค์ ๋์ ๋๋ฆฌ์๋ง ๊ณ์ํด์ ์ ๋ฐ์ดํธํด์ฃผ๊ณ , ์ฑํ ๋ฐฉ ์ํ์ ๋ํ ์ ๋ฐ์ดํธ๋ id๋ก ๊ตฌ๋ถํด์คฌ์ต๋๋ค. id 1๋ฒ์ด ๋ค์ด์์ต๋๋ค, 2๋ฒ์ด ๋ค์ด์์ต๋๋ค, 1๋ฒ์ด ๋๊ฐ์ต๋๋ค.. ์ด๋ฐ์์ผ๋ก ..!
- ๊ทธ๋ฆฌ๊ณ ๋งจ ๋ง์ง๋ง์ id๋ ๋๋ค์์ ๋งค์นญํด์ result์ ์ ์ฅํ์ต๋๋ค !
func ์คํ์ฑํ
๋ฐฉ์ฝ๋๊ฐ์ (_ record:[String]) -> [String] {
var NicknameDic: [String: String] = [:]
var chatState: [(id: String, state: String)] = []
for i in record {
let input = i.split(separator: " ").map { String($0) }
let (state, id) = (input[0], input[1])
switch state {
case "Enter":
let nickname = input[2]
if NicknameDic[id] != nil {
// ๊ธฐ์กด์ ๋๋ค์์ด ์๋๋ฐ, ์ด๋ฆ ๋ฐ๊พธ๊ณ ๋ค์ด์ด ๋ฐ๊ฟ์ค๋ค.
NicknameDic[id] = nickname
} else {
// ์์ผ๋ฉด ์ถ๊ฐํด์ค๋ค.
NicknameDic[id] = nickname
}
chatState.append((id: id, state: "๋ค์ด์์ต๋๋ค"))
case "Leave":
let leaveName = NicknameDic[id]!
chatState.append((id: id, state: "๋๊ฐ์ต๋๋ค"))
case "Change":
let changeName = input[2]
NicknameDic[id]! = changeName
default:
break
}
}
var result: [String] = []
for i in chatState.indices {
let id = chatState[i].id
result.append("\(NicknameDic[id]!)๋์ด \(chatState[i].state).")
}
return result
}
๋ค๋ฅธ ์ฌ๋๋ค ํ์ด๋ฅผ ๋ณด๋ ๋ ๊ฐ๊ฒฐํ๊ณ ์ข์ ์ฝ๋๋ค์ด ๋ง๋๋ผ๊ตฌ์. ๊ทธ ์ค์์ ํ๋๋ฅผ ์ดํด๋ดค์ต๋๋ค.
func solution(_ record:[String]) -> [String] {
let actions = ["Enter":"๋์ด ๋ค์ด์์ต๋๋ค.", "Leave":"๋์ด ๋๊ฐ์ต๋๋ค."]
var a = [String:String]()
record.forEach {
let separated = $0.components(separatedBy: " ")
if separated.count > 2 {
a[separated[1]] = separated[2]
}
}
return record.filter { !$0.contains("Change") }.map { (value:String) -> String in
let separated = value.components(separatedBy: " ")
let newString = a[separated[1]]! + actions[separated[0]]!
return newString
}
}
๋ค๋ฅธ ์ฌ๋ ์ฝ๋๋ฅผ ๋ณด๋๊น ์ ์ฝ๋์์ ๊ฐ์ ํด์ผํ ์ ์ด ๋ง๋ค์..
์ฒ์์ Enter Leave Change๋ฅผ ๋๋ ์ ์๊ฐํ๋ค๋ณด๋๊น switch ๋ฌธ์ ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ ์ฑ๋ก ์ฝ๋๋ฅผ ์์ ํ๋๋ฐ,
๋ ๊ฐ๊ฒฐํ๊ฒ ์งค ์ ์๋ค์ฅ.
๊ฐ์ฅ ํฐ ๊ฑด, ์ด์ฐจํผ ๋๋ค์์ ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ ๋๋ค์๋ง ํ์ํ๋๊น
switch ๋ฌธ์ผ๋ก ๋๋ ํ์ ์์ด ๊ทธ๋ฅ ๊ณ์ํด์ update๋ฅผ ํด์ฃผ๋ฉด๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํํฐ๋ฅผ ํ์ฉํด์ ๋ค๋ฅธ result ๋ฐฐ์ด์ ๋ง๋ค ํ์์์ด ์์๋๋ก return ํด์ฃผ๋๋ฐ์.
change๊ฐ ํฌํจ๋์ง ์์ ๊ธฐ๋ก๋ค๋ง ํํฐ๋งํด์ ๊ทธ ๊ฐ์ ์ถ๋ ฅํ์์ ๋ง๊ฒ ๋ฐ๊ฟ์ค๋๋ค.
์ด๋ ๊ฒ ๋ณด๋๊น ๋๊ฒ ๊ฐ๋จํ ๋ฌธ์ ๊ฐ๋ค์.
๋ ๋ฅ๊ทธ๋ฉ๊ทธ์ฒญ๊ทธ์ด...............................
์ค๋์ TIL.
์๋ . . . . . . .
'Private > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
20230403 TIL (2) | 2023.04.04 |
---|---|
20230402 TIL (0) | 2023.04.02 |
20230331 TIL (1) | 2023.04.01 |
20230330 TIL (2) | 2023.03.31 |
20230329 TIL (2) | 2023.03.30 |