본문 바로가기
Xcode/Swift - Algorithm

Swift) 프로그래머스(Lv1) - [1차] 비밀지도 (String)

by 후르륵짭짭 2020. 8. 23.
728x90
반응형

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

 

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

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

programmers.co.kr

안녕하세요 후르륵짭짭 입니다.

이번에는 다른 사람의 풀이를 보다가 이렇게도 할 수 있구나 싶어서 

기록을 남겨야 겠단 생각이 들어서 정리합니다.

문제 자체는 굉장히 직관적이라서 어렵지는 않습니다.

 

** 저의 풀이 ** 

더보기
func solution2(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String] = []
    
    let binaryArr1 = arr1.map { (number) -> String in
        
        let returnString = makeString(number: number , n)
        
        return returnString
    }
    
    let binaryArr2 = arr2.map { (number) -> String in
        
        let returnString = makeString(number: number, n)
            
        return returnString
    }
    
    
    for index in 0..<n{
        
        var returnValue : String = ""
        
        let tempOne = binaryArr1[index].map { (element) -> String in
            return String(element)
        }
        let tempTwo = binaryArr2[index].map { (element) -> String in
            return String(element)
        }
        
        for elementIndex in 0..<n{
            
            if tempOne[elementIndex] == tempTwo[elementIndex] {
                returnValue += tempOne[elementIndex]
            }
            else{
                returnValue += "#"
            }
            
        }
        
        answer.append(returnValue)
        
    }
    
    
    return answer
}

func makeString(number : Int,_ n : Int) -> String{
    
    var tempNumber = number
    var returnString = ""
    
    while tempNumber > 0 {
        
        if tempNumber % 2 == 0 {
            returnString.insert(" ", at: returnString.startIndex)
        }
        else{
            returnString.insert("#", at: returnString.startIndex)
        }
        
        tempNumber /= 2
        
    }
    
    for cnt in 0..<n{
        if number < Int(pow(2, Double(cnt))) {
            returnString.insert(" ", at: returnString.startIndex)
        }
    }
    
    return returnString
    
}

일반적인 풀이 방법과 같을 것 입니다. (너무 길어서 가립니다 ㅠㅠ)

각 배열의 숫자를 이진수로 변경하고

현재 숫자가 0부터 n-1 까지 증가하는 x에 2^x 보다 작을 때마다 공백을 넣어주게 됩니다.

그리고 마지막에 변경된 두 배열을 가지고 비교해서 정답을 반환하게 됩니다.

 

물론 다른 사람들의 코드도 이런 알고리즘과 같지만,,,, 이 코드를 확실하게 줄이는 

코드를 봐서 올려드립니다.

 

** 다른 사람의 코드 **

 peds님의 코드

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String] = []

    for i in 0..<n {
        var bitwise = String(arr1[i] | arr2[i], radix: 2)
        bitwise = String(repeating: "0", count: n-bitwise.count) + bitwise
        answer += [bitwise.reduce("", { $0 + ($1 == "1" ? "#" : " ") })]
    }

    return answer
}

심지어 어려운 코드가 아니기 때문에, 쉽게 정리 할 수 있습니다.

이 코드를 처음 보고 놀랐던 것은 2진수로 변경해주는 것이 있고 String( | ) 이 있다는 겁니다.

String( | )은 Int형이나 Int형 배열이 주어졌을 때, 둘중에 더 큰 결과 값이 주고 그리고 그것을 radix : 이진수 로 해서 반환합니다

이제 현재 이진수의 카운트가 최대 크기 n 보다 얼마나 작은지 보고 그 수 만큼 공백을 넣어줍니다.

그리고 reduce로 공백일 때는 공백, 1일 때는 #을 넣어줘서 합친 다음 결과를 반환해줍니다.

 

정말 Swift에 대해 많은 것을 배울 수 있었던 코드 입니다.

이런 간결하지만 내용이 알찬 코드 좋아합니다 ㅎㅎㅎㅎ

 

728x90
반응형

댓글