본문 바로가기
코딩테스트

프로그래머스 - [1차] 비밀지도 - swift

by vapor3965 2021. 6. 22.

목차

     

     

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

     

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

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

    programmers.co.kr

     

     

    간단한 문제다.

     

    두 숫자를 OR 연산하여 

    1인경우는 #으로 0인경우는 빈칸으로 변환하여 반환하면된다. 

    Swift에서는 숫자를 진수로 표현하게해주는 String 이니셜라이저가 있다. 

     

    이를 활용하면 한줄로도 작성이 가능하다. 

     

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

     

     

    항상 편리함에 익숙해진다면 막상 없이 풀라고하면 막막하다. 

    편리한것도 좋지만, 한번쯤은 사용하지않고도 풀어보는것도 매우 좋다라고 생각한다. 

    ( 면접에서도 종종 나오기도한다.  A로 만들고 싶을때, B를 이용하지않고 어떻게 만들까요? 와 같은 질문들 ) 

     

    아래는 OR연산한값을 통하여 2진수표현으로 나타내는 코드이다. 

    2진수는 2의최대배수로 1로 표시할 수 있다. 

     

    func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
        zip(arr1, arr2).map {
            var check = Array(repeating: " ", count: n)
            var x = $0|$1
            var t = 1
            var i = 0
            while t <= x {
                while t*2 <= x {
                    t *= 2
                    i += 1
                }
                check[n-i-1] = "#"
                x -= t
                i = 0
                t = 1
            }
            return check.joined()
        }
    }

     

     

     

     

     

     

     

    댓글