약수의 개수와 덧셈

KSang·2023년 12월 5일
0

[Kotlin]코드카타

목록 보기
32/100

🕵️문제설명

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

⚠️제한조건

1 ≤ left ≤ right ≤ 1,000

🤔 알고리즘 생각해보기

약수를 구하는 함수를 만들어 리스트로 약수를 받은뒤

size가 짝수면 더하고 홀수면 빼자

🔎 진행 과정

main

fun main() {
    var a = 0
    var b = 0
    while (true) {
        println("left를 입력하세요")
        try {
            a = readln().toInt()
            if (a !in 1..1000) {
                println("숫자는 1~ 1000 사이에 있어야 합니다")
                continue
            }
        }catch (e:NumberFormatException){
            println("숫자로 입력해주세요")
            continue
        }
        println("right를 입력하세요")
        try {
            b = readln().toInt()
            if (b !in 1..1000) {
                println("숫자는 1~ 1000 사이에 있어야 합니다")
                continue
            }else if(b < a){
                println("앞에서 입력한 값보다 커야 합니다")
                continue
            }
        }catch (e:NumberFormatException){
            println("숫자로 입력해주세요")
            continue
        }
        println("${solution(a,b)}")
    }

}

divisor

fun divisor(x: Int):IntArray {
    var answer = intArrayOf()
    var i = 1

    while (i <= x){
        if (x % i == 0){
            answer += i
        }

        i++
    }
    return answer
}

약수의 리스트를 만드는 함수

holzzac

fun holzzac(x: IntArray): Int{
    if(x.size % 2 == 0){
        return x[x.size-1]
    }else return -x[x.size-1]
}

약수의 개수가 홀수면 음수를 짝수면 양수를 리턴한다

solution

fun solution(left: Int, right: Int): Int {
    var answer: Int = 0
    var i = left
    while (i <= right){
        answer += holzzac(divisor(i))
        i++
    }
    return answer
}

📌최종 결과

package com.example.codekata

import java.lang.NumberFormatException

fun main() {
    var a = 0
    var b = 0
    while (true) {
        println("left를 입력하세요")
        try {
            a = readln().toInt()
            if (a !in 1..1000) {
                println("숫자는 1~ 1000 사이에 있어야 합니다")
                continue
            }
        }catch (e:NumberFormatException){
            println("숫자로 입력해주세요")
            continue
        }
        println("right를 입력하세요")
        try {
            b = readln().toInt()
            if (b !in 1..1000) {
                println("숫자는 1~ 1000 사이에 있어야 합니다")
                continue
            }else if(b < a){
                println("앞에서 입력한 값보다 커야 합니다")
                continue
            }
        }catch (e:NumberFormatException){
            println("숫자로 입력해주세요")
            continue
        }
        println("${solution(a,b)}")
    }

}

fun solution(left: Int, right: Int): Int {
    var answer: Int = 0
    var i = left
    while (i <= right){
        answer += holzzac(divisor(i))
        i++
    }
    return answer
}

fun divisor(x: Int):IntArray {
    var answer = intArrayOf()
    var i = 1

    while (i <= x){
        if (x % i == 0){
            answer += i
        }

        i++
    }
    return answer
}

fun holzzac(x: IntArray): Int{
    if(x.size % 2 == 0){
        return x[x.size-1]
    }else return -x[x.size-1]
}

0개의 댓글