[프로그래머스] 비밀지도
👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

[프로그래머스] 비밀지도

728x90
반응형

programmers.co.kr/learn/courses/30/lessons/17681?language=swift

 

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

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

programmers.co.kr

 

 

지도1과(배열) 지도2(배열) 두 개를 조건에 따라 합친 결과를 나타내주면 된다.

다만 배열의 원소가 Int로 주어지는데 2진법으로 바꾸어 표기해야한다. 

 

* 이번에 String(숫자, radix:2)를 하면 2진법 표현으로 바꿔 보여주는 걸 처음 알았다....!

 

 

[프로그래머스] 비밀지도

하나라도 #이면 #으로 표기 둘 다 빈칸이어야 빈칸으로 표기되는 조건이다. 

 

크게 거쳐야할 과정이 많지는 않다.

 

1. 2진법으로 배열 표현

 1-1. 자리수 맞춰주기 

2. 조건에 따라 값 할당하기

 

바로 코드로! 

 

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

    // 2진법으로 변환
    var secrets = arr1.map {String($0, radix:2)}
    var secrets_2 = arr2.map {String($0, radix:2)}
    
    // 자리수 안맞는 것들 맞춰주기 
    func convert(_ arr: inout [String]) {
        for (i,a) in arr.enumerated() {
            if a.count < n {
                arr[i] = String(repeating: "0", count: (n-a.count)) + String(a)
            }
        }
    }
    
    convert(&secrets)
    convert(&secrets_2)

    // 빈 정답 배열 생성
    var answer = Array(repeating: "", count:n)

    // 조건에 따라 정답 배열에 값 할당
    for i in 0..<n {
        let str = secrets[i]
        let str2 = secrets_2[i]
        for j in 0..<n {
            let v1 = str[str.index(str.startIndex, offsetBy: j)]
            let v2 = str2[str2.index(str2.startIndex, offsetBy: j)]
            if String(v1) == "1" || String(v2) == "1" {
                answer[i] += "#"
            } else {
                answer[i] += " "
            }
        }
    }

    
    return answer
}

 

[ 프로세스 ] 

* 위 설명 참고 

 


크게 어렵진 않았으나, String(n, radix:2)를 처음 알았다는 것과 inout 파라미터를 사용해서 변환시켰던 것, String은 여전히 string.index로 접근해야한다는 것... 

파이썬에서 슬라이싱하다가 스위프트에서 계속 슬라이싱하려니 익숙하지가 않다.. 계속 피하고픈 느낌..! 

그래도 상황에 맞게 사용하려면 문자열 다루는 방법은 계속 여러 방면으로 연습해두면 좋을 것 같다. 

728x90
반응형