1월 20일 TIL

이승원·2024년 1월 19일
0

TIL

목록 보기
3/75
post-thumbnail

프로그래머스 코딩테스트 [ 약수의 개수와 덧셈 ]

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()할때 내림차순으로 설정해주는 것이다. 아주 깔금한 한줄 코드로 변경되었다.
// 1st Try
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
}

// 2nd Try
func solution(_ s:String) -> String {
    var a = String(String(s.sorted()).reversed())
    return a
}

// Final Answer
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:) // 주어진 문자열을 진법에 맞게 해석해서 정수 혹은 String 혹은 Double 등등으로 반환한다. 

let base3String = String ( number, radix : 3) // 하면 number을 3진법으로 변환해서 String으로 저장.

let number = Int(base3String, radix: 3 ) // 하면 다시 10진법으로 저장. 
  • 어? 10진법으로 바꿀때 radix :10 해야하는거 아니야? 라고 처음엔 헷갈렸지만, 해당 이니셜라이저의 대한 정의를 다시 보니, 출력값은 항상 정수로 변환해서 나오기 떄문에, 주어진 Text가 어떤 진법인지의 대한 정보를 주는것 뿐이다.
  • 다만 String을 Int로 바꾸는거기 떄문에 반환에 성공하면 Optional Int, 아니면 Nil 이 된다. (String에 숫자 이외의 것이 있을 경우)
profile
개발자 (진)

0개의 댓글