Skip to content

Conversation

@giljihun
Copy link
Member

@giljihun giljihun commented May 21, 2025

πŸ”— 문제 링크

μ†ŒνŠΈ κ²Œμž„

image

저퀄 κΈΈμ†‘ν•©λ‹ˆλ‹€.

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1h

✨ μˆ˜λ„ μ½”λ“œ

문제λ₯Ό 보고, λ°”λ‘œ dfs ν˜Ήμ€ bfs둜 ν’€μ–΄μ•Όκ² λ‹€κ³  생각이 λ‚˜μ§ˆ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
그런데, μž…λ ₯에 λŒ€ν•΄ λ³€ν™”λ₯Ό 직접 ν•˜λ‚˜ν•˜λ‚˜ λ‚˜μ—΄ν•΄λ³΄λ‹ˆ
각 μˆœμ—΄μ˜ μƒνƒœκ°€ 1번의 turn을 κ°–κ³  λ°”λ€λ‹€λŠ” μ μ—μ„œ
각 μƒνƒœκ°€ κ°„μ„ μœΌλ‘œ μ—°κ²°λœ λ…Έλ“œμ™€ κ°™λ”κ΅°μš”. (κ·Έλž˜ν”„μ˜ λ…Έλ“œμ²˜λŸΌ μ„œλ‘œ μ—°κ²°λ˜λŠ” ꡬ쑰!)

ν•œλ§ˆλ””λ‘œ 초기 μƒνƒœμ—μ„œ μ΅œμ’…λΌμŠ€νŠΈνŒŒμ΄λ„μƒνƒœμΈ μ˜€λ¦„μ°¨μˆœ μƒνƒœλ‘œ κ°€λŠ” μ΅œμ € turn의 수.
κ³§ μ΅œλ‹¨ κ±°λ¦¬λΌλŠ” μ‚¬κ³ λ‘œ 연결이 λ˜λ„€μš”!
μΆ”κ°€μ μœΌλ‘œ, 문제 μ ‘κ·Ό ν›„ μ•Œκ³ λ¦¬μ¦˜μ„ μ„ νƒν•˜λŠ” μ˜μ—­μ—μ„œ C3μ—μ„œ 배운 Think Aloud 기법이 λ‚˜λ¦„ 도움이 λ˜λ”λΌκ³ μš”!

BFS 선택 κ·Όκ±°

ν˜„μž¬ μƒνƒœ -> λ‹€μŒ μƒνƒœλ₯Ό μ°Ύμ•„κ°€λŠ” μƒνƒœ 기반 문제의 ꡬ쑰 상,
κ°€κΉŒμš΄ μƒνƒœλ¨Όμ € λ‹€ μ²΄ν¬ν•˜λŠ” BFSκ°€ μžμ—°μŠ€λŸ½λ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.

특히, μ΅œλ‹¨ 경둜 λ₯Ό μ°ΎλŠ” λ¬Έμ œμ—μ„  κ°€λŠ₯ν•œ μƒνƒœμ˜ 수 (μ—¬κΈ°μ„  8! = 40320 이죡)λ₯Ό λ΄μ•Όν•©λ‹ˆλ‹€.
μ΅œλ‹¨κ²½λ‘œλŠ” bfs둜 무쑰건 찾기에, μ„±λŠ₯이슈만 ν™•μΈν•˜λ©΄ λ˜λ‹ˆκΉŒμš”!

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

1. DFS, BFS 선택 기쀀을 문제 κ΅¬μ‘°λ‘œλΆ€ν„° νŒŒμ•…ν•˜κΈ°

가끔 μ΅œλ‹¨ 경둜, 거리λ₯Ό ν’ˆμ— μžˆμ–΄μ„œ 두가지 λͺ¨λ‘ μ‚¬μš©λ˜λŠ” κ²½μš°λ„ 있고
κ²°κ΅­ 선택을 ν•˜κ²Œ λ˜λŠ”λ°μš”.
λ¬Όλ‘  λ‘˜λ‹€ μ‚¬μš©ν•΄λ³΄κ±°λ‚˜ 할쀄 μ•Œλ©΄ ν™•μ‹€ν•˜κ² μ§€λ§Œ,
κ²°κ΅­ κ·Έλƒ₯ μ™Έμš°λŠ”κ²Œ μ•„λ‹ˆλΌ 문제의 κ΅¬μ‘°λ‘œλΆ€ν„° μžμ—°μŠ€λŸ½κ²Œ λ„μΆœλ˜μ–΄μ•Ό ν•œλ‹€λŠ” κ±Έ λŠκΌˆμŠ΅λ‹ˆλ‹€.

DFSλŠ” μ–Έμ œ μœ λ¦¬ν•œκ°€?

β€œλͺ¨λ“  경우λ₯Ό λ‹€ 봐야 ν•˜λŠ” λ¬Έμ œβ€, 즉 μ™„μ „ 탐색 λ¬Έμ œμ— 적합

  • λͺ¨λ“  μ‘°ν•©/μˆœμ—΄μ„ λ‹€ λ”°μ Έμ•Ό ν•˜λŠ” 문제
    ex: λ°±νŠΈλž˜ν‚Ή, λΆ€λΆ„μ§‘ν•© κ΅¬ν•˜κΈ°, 탐색 κΉŠμ΄μ— 따라 κ°€μ§€μΉ˜κΈ°ν•  λ•Œ

  • νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” λͺ¨λ“  ν•΄λ₯Ό μ°Ύμ•„μ•Ό ν•  λ•Œ
    ex: νŠΉμ • κ²½λ‘œλ“€ 좜λ ₯, νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μ‘°ν•© 개수 μ„ΈκΈ° λ“±

λͺ©ν‘œκ°€ 졜적 경둜 κ°€ μ•„λ‹ˆλΌ λͺ¨λ“  경우 탐색 일 λ•Œ μœ λ¦¬ν•˜κ² λ„€μš”.

BFSλŠ” μ–Έμ œ μœ λ¦¬ν•œκ°€?

β€œλͺ©ν‘œ μƒνƒœμ— κ°€μž₯ 빨리 λ„λ‹¬ν•˜λŠ” 방법”, 즉 μ΅œλ‹¨ 거리/μ΅œμ†Œ 횟수 λ¬Έμ œμ— 적합

  • μ΅œλ‹¨ 거리, μ΅œμ†Œ μ—°μ‚°, μ΅œμ†Œ μ‹œκ°„ λ“±
    ex: 미둜 μ΅œλ‹¨ 경둜, 퍼즐 문제, 숫자 λ§Œλ“€κΈ°, 단어 λ³€ν™˜ λ“±

  • μƒνƒœ 전이가 κ°€λŠ₯ν•œ κ΅¬μ‘°μ—μ„œ κ°€μž₯ λ¨Όμ € λ„λ‹¬ν•œ 것이 정닡인 문제

거리 λ‹¨μœ„λ‘œ μƒνƒœλ₯Ό ν™•μž₯ν•˜λ©° 탐색해야할 λ•Œ μœ λ¦¬ν•˜κ² λ„€μš”.
λ¨Όμ € λ„λ‹¬ν•œ ν•΄ = μ •λ‹΅ (무쑰건 μ΅œλ‹¨ 경둜)


μœ„ λ‚΄μš© κΈ°μ€€μœΌλ‘œ λ‹€μ‹œ 문제λ₯Ό 보면,
이 λ¬Έμ œλŠ” λͺ¨λ“  경우λ₯Ό λ³Ό ν•„μš” μ—†μ£ ? (그건 μ΅œμ•…μ˜ 상황)
처음으둜 μ˜€λ¦„μ°¨μˆœ μƒνƒœμ— λ„λ‹¬ν•œ μˆœκ°„μ΄ λ°”λ‘œ μ •λ‹΅μ΄λ‹ˆκΉŒμš”!
κ·ΈλŸ¬λ‹ˆ, BFSκ°€ 적합!

μƒκ°μ˜ νž˜μ„ ν™•μž₯ν•˜λŠ” 게, μ•Œκ³ λ¦¬μ¦˜ 곡뢀같닀고 λŠλΌλŠ” 문제 νšŒκ³ μ˜€μŠ΅λ‹ˆλ‹€!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

κ·ΈλŸ¬λ„€μš” μ‹œμž‘ν•œ 지점에 λŒ€ν•΄μ„œλ§Œ SetμœΌλ‘œν•΄μ£Όλ©΄ λ˜λŠ”κ΅°μš” ..!
μ €λŠ” 괜히 μ–΅μ§€λ‘œ String으둜 μ €μž₯ν•˜λ €κ³  μ• λ₯Ό μΌμŠ΅λ‹ˆλ‹€..!

    func arrToString(_ arr: [Int]) -> String {
        return arr.map(String.init).joined(separator: "")
    }
    ///
    visited.insert(arrToString(arr))
    
    ```

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ €λŠ” μƒˆλ‘œμš΄λ°°μ—΄μ„ λ§Œλ“€κ³  i~kκΉŒμ§€ λ’€μ§‘κ³  λ‚˜λ¨Έμ§€λŠ” λΆ™μ—¬μ€¬λŠ”λ°, κ·Έλƒ₯ μ•ˆμ—λ§Œκ±΄λ“œλ €μ£Όλ©΄ λ˜μ—ˆλ„€μš” ..! 많이 λ°°μ›λ‹ˆλ‹€ πŸ‘

// startλΆ€ν„° k λ²ˆμ§ΈκΉŒμ§€ λ’€μ§‘μ–΄μ£ΌλŠ” ν•¨μˆ˜
    func reverseArr(_ arr: [Int], _ start: Int) -> [Int] {
        let end = start + K - 1
        return arr[0..<start] + arr[start ... end].reversed() + arr[end + 1..<arr.count]
    }
    ```

Copy link
Collaborator

@bishoe01 bishoe01 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

κ²½λ‘œνƒμƒ‰ 일거라고 생각도 λͺ»ν–ˆλ„€μš” πŸ‘
λ„μ €νžˆ 감이 μ•ˆμ™€μ„œ μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜λ³΄κ³ λ‚˜μ„œμ•Ό ν’€κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ μ„€λͺ…

  • arrToString Set에 ν˜„μž¬λ°°μ—΄ μ €μž₯ν•˜κΈ° μœ„ν•΄ 배열을 String으둜 λ°”κΏ”μ£ΌλŠ” ν•¨μˆ˜
    • 이것도 κ·Έλƒ₯ μ‹œμž‘startλ₯Ό Set에 μ €μž₯ν•΄μ€¬μœΌλ©΄ 더 μ½”λ“œκ°€ κΉ”λ”ν•΄μ‘Œμ„ 것 κ°™μ•„μš”
  • reverseArr λ°°μ—΄μ˜ 일뢀뢄을 λ’€μ§‘μ–΄ μ£ΌλŠ” ν•¨μˆ˜
    • 근데 κΈΈμ„ μƒλ‹˜ μ½”λ“œλ³΄λ‹ˆκΉŒ κ·Έλƒ₯ arr[start ... end].reverse() μ΄λ ‡κ²Œλ§Œ 해도 λ˜λ”λΌκ΅¬μš”..!

μˆ˜λ„μ½”λ“œ

  1. Bfsλ₯Ό μœ„ν•œ queue생성
  2. λ°©λ¬Έλ°°μ—΄ 생성 (Set)
  3. queueλ₯Ό λŒλ©΄μ„œ N-KκΉŒμ§€ 0λΆ€ν„° μ–΄λŠλΆ€λΆ„μ—μ„œ 배열을 뒀집을 수 μžˆλŠ”μ§€ μ „λΆ€ 탐색
  4. μΉ΄μš΄νŒ…μ„ 같이 μ„žμ–΄μ„œ νƒμƒ‰ν•˜λ‹€κ°€ answerArr와 배열이 κ°™μ•„μ§€λ©΄ return
func solution(N: Int, K: Int, arr: [Int]) -> Int {
    var answerArr = arr
    // μ™„μ„±ν–ˆμ„λ•Œμ˜ κΈ°μ€€
    answerArr.sort()
    // arrToString ->  Set μ €μž₯ν•˜λ €κ³  배열을 λ¬Έμžμ—΄λ‘œ λ°”κΏ”μ€¬μŒ
    let targetString = arrToString(answerArr)

    // startλΆ€ν„° k λ²ˆμ§ΈκΉŒμ§€ λ’€μ§‘μ–΄μ£ΌλŠ” ν•¨μˆ˜
    func reverseArr(_ arr: [Int], _ start: Int) -> [Int] {
        let end = start + K - 1
        return arr[0..<start] + arr[start ... end].reversed() + arr[end + 1..<arr.count]
    }

    func arrToString(_ arr: [Int]) -> String {
        return arr.map(String.init).joined(separator: "")
    }

    // 이미 μ •λ ¬λ˜μ–΄ μžˆλ‹€λ©΄ 0 λ°˜ν™˜
    if arrToString(arr) == targetString {
        return 0
    }

    var queue = [(currArray: [Int], count: Int)]()
    var pointer = 0
    var visited = Set<String>()

    queue.append((arr, 0))
    visited.insert(arrToString(arr))

    while pointer < queue.count {
        let targetArr = queue[pointer].currArray
        let cnt = queue[pointer].count
        let maxEnd = N - K

        for i in 0 ... maxEnd {
            let tmpArr = reverseArr(targetArr, i)
            let tmpArrString = arrToString(tmpArr)

            // λͺ©ν‘œ μƒνƒœμ— λ„λ‹¬ν–ˆλ‹€λ©΄ λ°”λ‘œ λ°˜ν™˜
            if tmpArrString == targetString {
                return cnt + 1
            }

            // λ°©λ¬Έλ°°μ—΄νŒλ‹¨
            if !visited.contains(tmpArrString) {
                queue.append((tmpArr, cnt + 1))
                visited.insert(tmpArrString)
            }
        }

        pointer += 1
    }

    return -1
}

@giljihun giljihun closed this Dec 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants