문제
풀이
중첩된 for 문을 사용하여 nums
의 세 인덱스를 조합한 뒤, 해당 위치의 원소를 모두 합한다.
함수를 사용하여 합이 소수인지 판별한 결과에 따라 반환값을 증가시킨다.
for 문 구성하기
조합하고자 하는 세 인덱스를 순서대로 i
, j
, k
라 하자.
j
, k
를 선택하기 위해 i
는 0에서 시작하여 마지막 인덱스 - 2까지만 반복한다.
j
는 i
와 중복되지 않도록 i + 1
에서 시작한다.
k
를 선택하기 위해 마지막 인덱스 - 1까지만 반복한다.
k
는 j
와 중복되지 않도록 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
}
코드
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
}
}
'Problem Solving > Programmers' 카테고리의 다른 글
【프로그래머스】 멀쩡한 사각형 (Kotlin) (0) | 2023.01.21 |
---|---|
【프로그래머스】 배달 (Kotlin) (0) | 2023.01.19 |
【프로그래머스】 힙 - 디스크 컨트롤러 (Kotlin) (0) | 2022.07.15 |
【프로그래머스】 더 맵게 (Java) (0) | 2022.07.05 |
【프로그래머스】 스택/큐 - 다리를 지나는 트럭 (Kotlin) (0) | 2022.07.05 |