suvera-dev ๐Ÿฅฆ

20230401 TIL ๋ณธ๋ฌธ

Private/TIL

20230401 TIL

suvera 2023. 4. 2. 01:31

์˜ค๋Š˜์€ ๋‚ ์”จ๊ฐ€ ๋„ˆ๋ฌด ์ข‹์•„์„œ

์‚ฐ์ฑ…์„ ์ž”๋œฉ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฝƒ๊ตฌ๊ฒฝ๋„ ํ•˜๊ณ  ~..

๊ทธ๋ž˜๋„ ๋Šฆ๊ฒŒ ๋‚˜๋งˆ ๋ถ€๋žด๋ถ€๋žด ์Šคํ„ฐ๋”” ์นดํŽ˜ ์™”์–ด์š”.

 

1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋•…๋”ฐ๋จน๊ธฐ 

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

- 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. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์˜คํ”ˆ์ฑ„ํŒ…๋ฐฉ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

- ๊ธฐ์กด ํ’€์ด

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
Comments