백준

비밀지도

화찌님 2023. 11. 12. 19:46

프로그래머스 - 비밀지도

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


내 코드

코드 통과가 되었다고 좋아했는데 좋은 코드가 아니라는것은 인식하고 있었다.

func solution(_ n:Int, _ arr1:[Int], _ arr2:[Int]) -> [String] {
    var arr1String: [String] = []
    var arr2String: [String] = []
    
    for number in 0..<n {
        arr1String.append(String(Int(arr1[number]), radix: 2))
        arr2String.append(String(Int(arr2[number]), radix: 2))
    }
    var result: [String] = []
    for i in 0..<n {
        var string1 = Array(arr1String[i])
        var string2 = Array(arr2String[i])
        var number1 = n - string1.count
        var number2 = n - string2.count
        if number1 != 0 {
            for _ in 0..<number1 {
                string1 = "0"+string1
            }
        }
        if number2 != 0 {
            for _ in 0..<number2 {
                string2 = "0"+string2
            }
        }
        var resultString = ""
        for i in 0..<n {
            if string1[i] == "1" || string2[i] == "1" {
                resultString += "#"
            }else {
                resultString += " "
            }
        }
        result.append(resultString)
    }
    return result
}

2중 포문도 들어가있고, 1과 2 똑같은 절차를 진행하다보니 코드가 길어졌다.


다른사람의 코드

대단합니다.

func solution1(_ 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
}

코드 분석

1. Int와 Int의 or연산을 이용하여 2진수로 만드는코드

String(arr1[i] | arr2[i], radix: 2)

이론으로는 많이 봐왔지만 정작 써본적이 없었던 OR연산.

문제를 읽으면서 OR연산이라고 느끼긴 했지만 막상 어떻게 사용해야 할 지 몰라서 for문을 돌며 1이거나 || 1이면 "#"라고 입력했었는데, 

이런 간단한 방법이 있다니.

다음엔 꼭 써먹고 말테다

 

2. 문자의 길이를 맞춰주기 위한 코드(일정 길이보다 작을시 앞에 0을 채워줌)

String(repeating: "0", count: n-bitwise.count)

이것도 String의 repeating, count를 생각하지 못했다. 

사실 repeating,count는 2차원 배열을 생성할때 사용했었던 Array에만 존재하는 줄 알았다.

이 과정을 코딩할때도 반복문을 돌렸는데

이 방법 또한 유용하게 사용할 수 있을것 같다.

 

3. reduce를 사용한 코드

answer += [bitwise.reduce("", { $0 + ($1 == "1" ? "#" : " ") })]

reduce의 $0(첫번째 파라미터)는 result

reduce의 $1(두번째 파라미터)는 element

내 코드는 or을 사용하여 1이 있다면 #을 또!!! 반복문 돌렸는데

reduce를 이용하여 이렇게 간단하게 식을 만들 수 있다.

알고리즘 문제를 준비하면서 다른 고차함수들은 사용해 보았어도 reduce는 사용해보지 않았던거 같은데, 

신경써서 몇번 써봐야 손에 잘 익을 것 같다.


저번에 익였던 진수 변환(radix)을 사용하고 테스트에 통과되어서 뿌듯 그 자체였지만,

역시 통과로 끝내기 보단 다른사람의 코드와 비교를 하는것이

실력에 있어서 많은 도움이 되는것 같다.

 

오늘도 즐코딩

 

'백준' 카테고리의 다른 글

숨바꼭질 2  (0) 2023.12.24
그래프 BFS DFS  (1) 2023.11.19
연속되는 문자에 관한 문제 풀이  (0) 2023.11.11
[Swift] 진법 변환 radix  (0) 2023.11.11
백준 스위프트 2108 통계학  (0) 2023.01.10