iOS 개발일기

[Swift] 프로그래머스(코딩테스트 연습: LEVEL 1) - [1차] 비밀지도 본문

코딩테스트

[Swift] 프로그래머스(코딩테스트 연습: LEVEL 1) - [1차] 비밀지도

맨날 까먹으니 적어두자 2021. 8. 6. 15:21

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

 

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

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

programmers.co.kr

 

나의 풀이

func solution(_ n: Int, _ arr1: [Int], _ arr2: [Int]) -> [String] {
    var answer: [String] = []
    
    zip(arr1, arr2).forEach { item1, item2 in
    	guard let item1 = Int(String(item1, radix: 2)) else {return}
        guard let item2 = Int(String(item2, radix: 2)) else {return}
        let line = String(item1 + item2)
        
        let result = line.map({$0 == "0" ? " " : "#"}).joined()
        let space = String(repeating: " ", count: n - result.count)
        
        answer.append(space + result)
    }
    
    return answer
}

저는 10진수로 된 두 수를 2진법으로 변환하고 두 수를 덧셈하였습니다.

이렇게 한다면 두 수의 각 위치마다 모두 0인 수 외에는 1이상의 수가 나오므로 문자열을 치환하기 편할 것 같아 이 방법을 사용하였습니다.

 

여기서 지도의 크기보다 적은 문자열의 수를 가진 경우에는 가장 앞자리의 수가 0이 나와 Int형으로 변형하였을 때 제거되기 때문에 문제에서 원하는 답을 도출할 수 없게됩니다. 

ex) "001111"을 Int형으로 변환할 경우 "1111"으로 변환되죠.

 

이러한 경우를 고려하여 부족한 "0"의 수 즉, 공백의 수만큼 'String(repeating repeatedValue: Int, count: Int)'함수를 사용하여 공백을 출력하도록 하였습니다.

 

처음에는 꽤 괜찮게 작성한 함수라고 생각하고 제출했었는데

역시 다른 분들의 풀이를 보자마자 충격받았습니다... 아직 실력이 많이 부족한 것 같네요...

다른 분들의 풀이를 보고 영감을 얻어 조금 더 간결하게 수정해보았습니다.

 

저는 개인적으로 옵셔녈(!, ?)을 좋아하지 않기 때문에 guard let 또는 if let 을 사용하여 옵셔널 바인딩을 해주는 편입니다.

그런데 아래와 같은 방법으로 옵셔널 바인딩을 할 필요없이 작성할 수 있다는 것을 알게되었습니다.

 

보완한 풀이

func solution(_ n: Int, _ arr1: [Int], _ arr2: [Int]) -> [String] {
    var answer: [String] = []
    
    for i in 0..<n {
        let line = String(arr1[i] | arr2[i], radix: 2)
        let result = line.map({$0 == "0" ? " " : "#"}).joined()
        let space = String(repeating: " ", count: n - result.count)
        
        answer.append(space + result)
    }
    
    return answer
}