Problem Solving/Programmers

【프로그래머스】 소수 만들기 (Kotlin)

까망사과 2023. 1. 17. 15:00

문제

 

프로그래머스

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

programmers.co.kr

 

풀이

중첩된 for 문을 사용하여 nums의 세 인덱스를 조합한 뒤, 해당 위치의 원소를 모두 합한다.

함수를 사용하여 합이 소수인지 판별한 결과에 따라 반환값을 증가시킨다.

 

for 문 구성하기

조합하고자 하는 세 인덱스를 순서대로 i, j, k라 하자.

 

j, k를 선택하기 위해 i는 0에서 시작하여 마지막 인덱스 - 2까지만 반복한다.

 

ji와 중복되지 않도록 i + 1에서 시작한다.

k를 선택하기 위해 마지막 인덱스 - 1까지만 반복한다.

 

kj와 중복되지 않도록 j + 1에서 시작하며 마지막 인덱스까지 반복한다.

var answer = 0
val lastIndex = nums.lastIndex

for (i in 0..(lastIndex - 2)) {
    for (j in (i + 1)..(lastIndex - 1)) {
        for (k in (j + 1)..lastIndex) {
            // prime 함수로 세 원소의 합이 소수인지 판별한다.
            if (prime(nums[i] + nums[j] + nums[k])) {
                answer++
            }
        }
    }
}

 

소수 판별하기

prime 함수는 파라미터로 전달받은 Int가 소수인지 아닌지 판별한 결과를 Boolean으로 반환한다.

fun prime(num: Int): Boolean {
    // 1은 소수가 아니므로 바로 false를 반환한다.
    if (num == 1) {
        return false
    }
    
    // 이외의 경우 2부터 시작하여 num의 약수를 찾는다.
    // 반복 횟수를 줄이기 위해 i가 n의 제곱근 이하인 동안 반복한다. 
    var i = 2
    while (i * i <= num) {
        // 약수를 발견하면 num은 소수가 아니므로 false를 반환한다.
        if (num % i++ == 0) {
            return false
        }
    }
    
    // 약수가 없으면 소수이므로 true를 반환한다.
    return true
}

 

코드

 

GitHub - blacksg/ProblemSolving

Contribute to blacksg/ProblemSolving development by creating an account on GitHub.

github.com

class Solution {
    fun solution(nums: IntArray): Int {
        var answer = 0
        val lastIndex = nums.lastIndex
        for (i in 0..(lastIndex - 2)) {
            for (j in (i + 1)..(lastIndex - 1)) {
                for (k in (j + 1)..lastIndex) {
                    if (prime(nums[i] + nums[j] + nums[k])) {
                        answer++
                    }
                }
            }
        }
        return answer
    }
    
    fun prime(num: Int): Boolean {
        if (num == 1) {
            return false
        }
        var i = 2
        while (i * i <= num) {
            if (num % i++ == 0) {
                return false
            }
        }
        return true
    }
}