πŸ§‘πŸ»‍πŸ’» Coding Test/⌨️ Programmers

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ] [1μ°¨] 비밀지도

EarthSea 2024. 3. 25. 00:04

 

 

πŸ„ μ½”λ”©ν…ŒμŠ€νŠΈ

 μ½”λ”©ν…ŒμŠ€νŠΈ 문제 풀이

✍🏻 Github

문제 풀이 github 링크

 

 

문제 μ„€λͺ…

λ„€μ˜€λŠ” ν‰μ†Œ ν”„λ‘œλ„κ°€ λΉ„μƒκΈˆμ„ μˆ¨κ²¨λ†“λŠ” μž₯μ†Œλ₯Ό μ•Œλ €μ€„ 비밀지도λ₯Ό 손에 λ„£μ—ˆλ‹€. 그런데 이 λΉ„λ°€μ§€λ„λŠ” 숫자둜 μ•”ν˜Έν™”λ˜μ–΄ μžˆμ–΄ μœ„μΉ˜λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•”ν˜Έλ₯Ό 해독해야 ν•œλ‹€. λ‹€ν–‰νžˆ 지도 μ•”ν˜Έλ₯Ό 해독할 방법을 적어놓은 λ©”λͺ¨λ„ ν•¨κ»˜ λ°œκ²¬ν–ˆλ‹€.

  1. μ§€λ„λŠ” ν•œ λ³€μ˜ 길이가 n인 μ •μ‚¬κ°ν˜• λ°°μ—΄ ν˜•νƒœλ‘œ, 각 칸은 "곡백"(" ") λ˜λŠ” "λ²½"("#") 두 μ’…λ₯˜λ‘œ 이루어져 μžˆλ‹€.
  2. 전체 μ§€λ„λŠ” 두 μž₯의 지도λ₯Ό κ²Ήμ³μ„œ 얻을 수 μžˆλ‹€. 각각 "지도 1"κ³Ό "지도 2"라고 ν•˜μž. 지도 1 λ˜λŠ” 지도 2 쀑 μ–΄λŠ ν•˜λ‚˜λΌλ„ 벽인 뢀뢄은 전체 μ§€λ„μ—μ„œλ„ 벽이닀. 지도 1κ³Ό 지도 2μ—μ„œ λͺ¨λ‘ 곡백인 뢀뢄은 전체 μ§€λ„μ—μ„œλ„ 곡백이닀.
  3. "지도 1"κ³Ό "지도 2"λŠ” 각각 μ •μˆ˜ λ°°μ—΄λ‘œ μ•”ν˜Έν™”λ˜μ–΄ μžˆλ‹€.
  4. μ•”ν˜Έν™”λœ 배열은 μ§€λ„μ˜ 각 κ°€λ‘œμ€„μ—μ„œ λ²½ 뢀뢄을 1, 곡백 뢀뢄을 0으둜 λΆ€ν˜Έν™”ν–ˆμ„ λ•Œ μ–»μ–΄μ§€λŠ” μ΄μ§„μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” κ°’μ˜ 배열이닀.

λ„€μ˜€κ°€ ν”„λ‘œλ„μ˜ λΉ„μƒκΈˆμ„ 손에 넣을 수 μžˆλ„λ‘, λΉ„λ°€μ§€λ„μ˜ μ•”ν˜Έλ₯Ό ν•΄λ…ν•˜λŠ” μž‘μ—…μ„ 도와쀄 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

μž…λ ₯ ν˜•μ‹

μž…λ ₯으둜 μ§€λ„μ˜ ν•œ λ³€ 크기 n κ³Ό 2개의 μ •μˆ˜ λ°°μ—΄ arr1, arr2κ°€ λ“€μ–΄μ˜¨λ‹€.

  • 1 ≦ n β‰¦ 16
  • arr1, arr2λŠ” 길이 n인 μ •μˆ˜ λ°°μ—΄λ‘œ μ£Όμ–΄μ§„λ‹€.
  • μ •μˆ˜ λ°°μ—΄μ˜ 각 μ›μ†Œ xλ₯Ό μ΄μ§„μˆ˜λ‘œ λ³€ν™˜ν–ˆμ„ λ•Œμ˜ κΈΈμ΄λŠ” n μ΄ν•˜μ΄λ‹€. 즉, 0 ≦ x β‰¦ 2 - 1을 λ§Œμ‘±ν•œλ‹€.
  • n

 

좜λ ₯ ν˜•μ‹

μ›λž˜μ˜ 비밀지도λ₯Ό ν•΄λ…ν•˜μ—¬ '#', κ³΅λ°±μœΌλ‘œ κ΅¬μ„±λœ λ¬Έμžμ—΄ λ°°μ—΄λ‘œ 좜λ ₯ν•˜λΌ.

 

μž…μΆœλ ₯ 예제

λ§€κ°œλ³€μˆ˜ κ°’
n 5
arr1 [9, 20, 28, 18, 11]
arr2 [30, 1, 21, 17, 28]
좜λ ₯ ["#####","# # #", "### #", "# ##", "#####"]
λ§€κ°œλ³€μˆ˜ κ°’
n 6
arr1 [46, 33, 33 ,22, 31, 50]
arr2 [27 ,56, 19, 14, 14, 10]
좜λ ₯ ["######", "### #", "## ##", " #### ", " #####", "### # "]

 

 

문제 풀이

λ‚˜μ˜ 풀이

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    
    return (0..<n).map{
        var orStr = String(arr1[$0]|arr2[$0], radix: 2)
        return (String(repeating: "0",count: n-orStr.count) + orStr).map{ $0 == "1" ? "#" : " " }.joined()
                      }
}

λΉ„νŠΈμ—°μ‚°μžκ°€ Int κ°’μœΌλ‘œ λ˜λŠ”μ§€ λͺ°λΌμ„œ ν—€λ§€μ—ˆλ˜ 문제!

ν•˜μ§€λ§Œ λΉ„νŠΈμ—°μ‚°μžκ°€ Int κ°’μœΌλ‘œ λ˜λŠ” 것을 μ•ˆ μ΄ν›„μ—λŠ” λ§‰νž˜μ—†μ΄ ν’€λ Έλ‹€.

카카였 문제 쀑 제일 μ‰¬μ› λ˜ 문제 κ°™λ‹€.

 

λ‹€λ₯Έ μ‚¬λžŒ 풀이

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    return (0..<n).map { String(String(arr1[$0]|arr2[$0]|2<<(n - 1), radix: 2).map { $0 == "1" ? "#" : " " }[1...n]) }
}

 

arr1[$0]|arr2[$0]|2 λ₯Ό (n-1)만큼 μ‹œν”„νŠΈν•œλ‹€?!

λΌλŠ”κ²Œ 2λŠ” 10 인데 이 κ²ƒκΉŒμ§€ OR 연산을 ν•΄μ„œ μ‹œν”„νŠΈλ₯Ό ν•˜λŠ” μ΄μœ λŠ” μžλ¦Ώκ°’μ„ λ§žμΆ”κ³  μ‹Άμ–΄μ„œκ² μ§€?!

와.. 근데 μ €λŸ° 생각을 μ–΄μΊν•˜μ§€..

 

μ€‘μš”ν•œ κ°œλ…

  • λΉ„νŠΈμ—°μ‚°μž

~ A : A의 λΉ„νŠΈλ₯Ό λ°˜μ „ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜

A & B : A와 B의 λΉ„νŠΈ AND 논리 μ—°μ‚° μ‹€ν–‰

A | B : A와 B의 λΉ„νŠΈ OR 논리 μ—°μ‚° μ‹€ν–‰

A ^ B : A와 B의 λΉ„νŠΈ XOR 논리 μ—°μ‚° μ‹€ν–‰

A >> B / A << B : A의 λΉ„νŠΈλ₯Ό B만큼 μ‹œν”„νŠΈ 이동

→ λΉ„νŠΈ μ—°μ‚°μžλŠ” μ •μˆ˜μƒνƒœλ‘œλ„ κ°€λŠ₯

 

  • μ‹­μ§„μˆ˜λ₯Ό μ΄μ§„μˆ˜λ‘œ λ³€ν™˜
String( Int κ°’, radix: 2)