프로그래머스 코딩테스트 [ 약수의 개수와 덧셈 ]
Github 링크
- 이 문제는 쉽게 풀 수 있었다. 단순히 주어진 범위의 수를 일일이 약수 의 수를 구한다음에 해당 약수의 개수가 짝수인지 홀수인지만 확인하면 되는 문제인데. 문득 다 풀고 더 좋은 방법으로 풀수 있는 방법이 없을까 고민해서 다른사람은 어떻게 풀었는지 확인 해보았다.
func solution(_ left: Int, _ right: Int) -> Int {
return (left...right).map
{ i in (1...i).filter
{ i % $0 == 0 }.count % 2 == 0 ? i : -i }
.reduce(0, +)
}
- 우선 left...right의 범위를 생성하고, 이 범위에 대해서 map 함수를 호출하고 있으며, map 함수는 범위 내의 각 숫자 (i)의 대한 작업을 하고, 새로운 배열을 반환한다.
{ i in
(1...i).filter { i % $0 == 0 }.count % 2 == 0 ? i : -i
}
- 이 클로저에서는 i 라는 변수를 입력으로 받고, 1부터 i까지의 범위를 생성하고, 해당 범위를 filter하여 i % (1...i) ==0 의 조건을 부합하는 새로운 배열을 만들고 있다.
- 그리고 해당 배열의 count 즉 개수가 짝수인지 홀수 인지의 대한 여부를 확인하고, 여부에 따라서 i 혹은 -i로 return 한다.
- return 되는 숫자는 결국 map에 저장이 되고, reduce(0,+)로 합을 구하는것이다.
논리적으로는 누구나 똑같이 생각할 수 있지만, 이렇게 간결하게 코드를 만들수 있다는것에 또 한번 놀랐다.
꼭 써야하는건 아니지만, 기억해놓고 나중에 한번 사용해보자.
프로그래머스 코딩테스트 [ 문자열 내림차순으로 배치하기 ]
Github 링크
- 정말 단순한 문제이지만 swift로 풀다보니깐 아직 모르는게 많았다.
- 우선 총 3번 풀었는데, 첫번째는 String.sorted()함수가 있는 줄 모르고, String의 각 char을 배열에 저장해서 sort()함수를 사용하여 reverse()를 사용했다.
- 역시나 더 좋은 방법이 없을까 찾아보다가, String 자체에도 sorted()함수가 있다는걸 알고 썼는데, sorted()함수를 사용하면 Character 배열로 출력이 되기 때문에, 해당 배열을 String으로 변환해야한다. 그리고 다시 해당 String을 reversed()해서 또 다시 String으로 변환. 역시나 이방법도 이상하다.
- 마지막은 방법은 단순하게 sort()할때 내림차순으로 설정해주는 것이다. 아주 깔금한 한줄 코드로 변경되었다.
func solution(_ s:String) -> String {
var temp = s
var arr : [String] = []
for i in temp {
arr.append(String(i))
}
arr.sort()
arr.reverse()
let ans = arr.map {String($0)}.joined()
return ans
}
func solution(_ s:String) -> String {
var a = String(String(s.sorted()).reversed())
return a
}
func solution(_ s:String) -> String {
return String(s.sorted{$0 > $1})
}
프로그래머스 코딩테스트 [ 최대공약수와 최소공배수 ]
Github 링크
- 정말 몇번째 보는 문제인지 모르겠는 최대공약수와 최소공배수 문제
- 이건 재귀함수를 사용해서 짜면된다.
func gcd(_ a:Int, _ b:Int) -> Int {
if b == 0 {
return a
}else{
return gcd(b, a % b)
}
}
func lcm(_ a:Int, _ b:Int) -> Int {
return (a*b) / gcd(a,b)
}
프로그래머스 코딩테스트 [ 3진법 뒤집기 ]
Github 링크
- 이 문제는 원래는 당연히 각 자리수마다 반복문 사용해서 하는거 같은데, Swift에서는 진법 변환해주는 method가 있다. 정확히는 Initializer 가 있다.
init(_:radix:)
let base3String = String ( number, radix : 3)
let number = Int(base3String, radix: 3 )
- 어? 10진법으로 바꿀때 radix :10 해야하는거 아니야? 라고 처음엔 헷갈렸지만, 해당 이니셜라이저의 대한 정의를 다시 보니, 출력값은 항상 정수로 변환해서 나오기 떄문에, 주어진 Text가 어떤 진법인지의 대한 정보를 주는것 뿐이다.
- 다만 String을 Int로 바꾸는거기 떄문에 반환에 성공하면 Optional Int, 아니면 Nil 이 된다. (String에 숫자 이외의 것이 있을 경우)