티스토리 뷰

반응형

 

 

 

 

프로그래머스 1단계 카카오 코테 문제, 비밀지도 링크 ▼

 

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

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

programmers.co.kr

 

오늘 풀어볼 문제는 카카오의 옛날 기출문제인 비밀지도 문제입니다. 최근에 알고리즘 문제를 많이 풀지 않아서, 주말을 틈타 하나 쉬운거 스위프트로 풀어보았네요. 문제 설명에 대해서는 위 링크를 통해 숙지하고 포스팅 봐주시기 바래요.

 

 

 

 


비밀지도 카카오 코딩테스트 기출 문제설명

문제의 목적은 단순합니다. 위와 같이 보물지도를 표현하는데 주어지는 1, 2 십진수 배열을 합한 결과를 보물지도 문자열 배열로 출력해주면 되는 문제입니다. 이 문제는 | (or)연산을 통해서 비트연산을 수행하면 비교적 간단하게 풀 수 있는 문제입니다. 

 

바로 swift언어를 통해 문제 풀어보도록 하겠습니다. 

 

 

 

 


비밀지도 카카오 코딩테스트 기출 swift 문제 풀이

1행) 먼저 배열의 크기, arr1, arr2의 합해야할 보물지도 배열(십진수 표현된 [Int]타입 배열)을 인자로 받고 있습니다.

2행) sumList는 두개의 이진수배열의 or 비트연산한 결과를 저장할 배열입니다.

3 ~ 5행) arr1의 (인덱스, 값)을 순회하면서 (enumerated + forEach) arr1, arr2 각각의 동일 인덱스에 대응되는 십진수 값들로 비트연산을 수행합니다. 두개의 보물지도를 합해야하는 것은 곧, | (or)연산을 의미합니다. 둘 중 하나만 1("#")이면 true("#")가 되는 겁니다. 이는 두개의 보물지도를 합치는 것과 동일한 결과를 보여줍니다. 4행에서 '|' 연산을 수행해서 sumLists에 넣고 있습니다.

 

 

 

 

앞서 sumList를 통해서 arr1, arr2지도를 합한 보물지도의 정보를 Int 배열 [Int]로 받았죠? 십진수 값이 들어있는 배열을 그대로 보물지도로 변환해서 반환하면 될 것입니다. 위 코드가 이를 구현하고 있습니다.

 

10행) length 변수를 통해 while문의 연산횟수를 구하는 이유는 swift 의 String타입에서 제공하는 count의 시간복잡도가 n이기 때문에 사용해봤습니다.

 

11 ~ 16행) sumList의 각 값을 돌면서 십진수 값에 대응되는 이진수 값을 보고, 이진수의 1이 있는 곳은 "#", 1이 아닌 곳은 " "로 대응해서 보물지도를 그리고, answer에 추가해주고 있습니다. 이렇게 결과적으로 arr1, arr2를 합한 보물지도를 반환할 수 있게됩니다. while문에서 변환된 보물지도 문자열의 길이가 n이 되지 않는 경우에는 그만한 길이를 앞에 추가시켜주어  answer에 추가해줍니다. (모든 보물지도 문자열은 길이가 n이어야 하는데, while 연산이 n회가 되지 않는 경우가 있기 때문)

 

본 코드의 제출 결과및 전체코드는 아래와 같습니다. 더 좋은 방법과 아이디어가 많을거라 생각합니다. 언제든 의견과 질문 환영합니다. 😁

 

 

 

 

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var sumList: [Int] = []
    arr1.enumerated().forEach { (index, value) in
        sumList.append(value | arr2[index])
    }
    
    return sumList.reduce(into: []) { (answer, element) in
        var value = element
        var result = ""
        var length = 0
        while value > 0 {
            result = "\(value % 2 == 0 ? " " : "#")\(result)"
            value /= 2
            length += 1
        }
        answer.append(String(repeating: " ", count: n - length) + result)
    }
}

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함