728x90
반응형
programmers.co.kr/learn/courses/30/lessons/17681
안녕하세요 후르륵짭짭 입니다.
이번에는 다른 사람의 풀이를 보다가 이렇게도 할 수 있구나 싶어서
기록을 남겨야 겠단 생각이 들어서 정리합니다.
문제 자체는 굉장히 직관적이라서 어렵지는 않습니다.
** 저의 풀이 **
더보기
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
반응형
'Xcode > Swift - Algorithm' 카테고리의 다른 글
Swift ) 프로그래머스(Lv1) - [1차] 다트 게임 (RegularExpression&Split) (0) | 2020.08.27 |
---|---|
Swift) 프로그래머스(Lv1)- 실패율 (Sorted) (0) | 2020.08.26 |
Swift) LeetCode(Easy) - Word-Pattern (Hash&String) (0) | 2020.08.20 |
Swift) LeetCode(Easy) - Symmetric Tree (BFS&Recursive) (0) | 2020.08.18 |
Swift) LeetCode(Easy) - Minimum Depth of Binary Tree (BFS&DFS) (0) | 2020.08.18 |
댓글