[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 비밀지도 (프로그래머스 lv1, 스위프트)

inu 2022. 2. 5. 21:02
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

풀이

// 방법 1 ("0"으로 이루어진 패딩을 계산적으로 추가해준 뒤 replacingOccurrences로 치환)
func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String] = []
    for idx in 0..<n {
        var str = String(arr1[idx] | arr2[idx], radix: 2)
        str = String(repeating: "0", count: n-str.count) + str
        str = str.replacingOccurrences(of: "0", with: " ")
        str = str.replacingOccurrences(of: "1", with: "#")
        answer.append(str)
    }
    return answer
}

// 방법 2 (2 << (n - 1)를 통해 패딩추가후 replacingOccurrences로 치환, 마지막에는 제일 앞의 1 제거)
func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String] = []
    for idx in 0..<n {
        var str = String(arr1[idx] | arr2[idx] | 2 << (n - 1), radix: 2)
        str = str.replacingOccurrences(of: "0", with: " ")
        str = str.replacingOccurrences(of: "1", with: "#")
        str.removeFirst()
        answer.append(str)
    }
    return answer
}

// 방법 3 (2 << (n - 1)를 통해 패딩추가후 map으로 치환)
func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String] = []
    for idx in 0..<n {
        var str = String(arr1[idx] | arr2[idx] | 2 << (n - 1), radix: 2)
        str = String(str.map { $0 == "1" ? "#" : " " }[1...n])
        answer.append(str)
    }
    return answer
}

// 방법 4 (방법 3을 한줄로 변경)
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])
    }
}
  • swift에서 비트연산자를 써본게 처음이라 인상적인 문제였다.
  • 나는 최초에 방법1로 문제를 해결했다.
  • 2 << (n - 1)를 통해 n개의 0을 만들고 제일 앞에 존재하는 1을 제거하는 것이 신박했다.
반응형