공대생의 비망록

[프로그래머스][Lv. 1] 비밀지도 Swift 풀이 본문

Programming Language/Swift

[프로그래머스][Lv. 1] 비밀지도 Swift 풀이

myungsup1250 2022. 4. 7. 00:20

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

 

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

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

programmers.co.kr

풀이

 

2018 KAKAO BLIND RECRUITMENT 1차 코딩테스트에 나온 문제.

 

처음에는 문제 설명에 충실하게 arr1, arr2에 있는 10진수 값을 2진수로 바꾸고 둘 다 0일 경우 빈 공간, 그렇지 않고 둘 중 하나라도 1일 경우 벽으로 계산하는 방법으로 진행했었다.

문제 해결 후 다시 생각해보니, 비트 연산(OR 연산)을 설명한 것이랑 다를 것이 전혀 없어 간소화한 코드를 시도해봤고, 성공했다!

Swift 언어가 아니라 다른 언어를 사용했었다면 어땠을까 생각하며 두 버전을 모두 기록으로 남기기로 결정했다.

 

끝!

 

<간결한 버전>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String= Array(repeating: "", count: n)
    for i in 0..<n {
        var bin: String = String(arr1[i] | arr2[i], radix: 2)
        while bin.count < n {
            bin = "0" + bin
        }
        for j in 0..<n {
            answer[i].append(bin[bin.index(bin.startIndex, offsetBy: j)] == "0" ? " " : "#")
        }
    }
    
    return answer
}
cs

 

<처음 풀이한 버전>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var answer: [String= Array(repeating: "", count: n)
    for i in 0..<n {
        var bin1: String = String(arr1[i], radix: 2), bin2: String = String(arr2[i], radix: 2)
        while bin1.count < n {
            bin1 = "0" + bin1
        }
        while bin2.count < n {
            bin2 = "0" + bin2
        }
        for j in 0..<n {
            if bin1[bin1.index(bin1.startIndex, offsetBy: j)] == "0" && bin2[bin2.index(bin2.startIndex, offsetBy: j)] == "0" {
                answer[i].append(" ")
            } else {
                answer[i].append("#")
            }
        }
    }
    
    return answer
}
cs
Comments