λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Private/TIL

20230401 TIL

λ°˜μ‘ν˜•

μ˜€λŠ˜μ€ 날씨가 λ„ˆλ¬΄ μ’‹μ•„μ„œ

산책을 μž”λœ© ν–ˆμŠ΅λ‹ˆλ‹€. 꽃ꡬ경도 ν•˜κ³  ~..

κ·Έλž˜λ„ 늦게 λ‚˜λ§ˆ λΆ€λž΄λΆ€λž΄ μŠ€ν„°λ”” 카페 μ™”μ–΄μš”.

 

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