728x90
[깃허브]
https://github.com/heesoo-park/ForCodeKata/tree/main/%EC%A0%90%20%EC%B0%8D%EA%B8%B0
[프로그래머스]
https://school.programmers.co.kr/learn/courses/30/lessons/140107
또 엄청 큰 숫자까지 고려해야하는 문제였다.
그냥 보면 2중반복문이 바로 떠오르는 문제였지만 너무 그게 보여서 손을 댈 수가 없었다.
그런데 단일 반복문으로 할 수 있는 방법이 생각났다.
바로 거리 공식을 이용하는 것이다.
a^2 + b^2 = c^2 말이다.
0부터 숫자를 k만큼 늘려가면서 제곱한 수를 d^2에서 뺐다.
그러면 x좌표가 어떤 값일 때 최대 y좌표값을 얻을 수 있다.
원을 생각하면 편하다.
거기서 최대 y좌표값보다는 작으면서 k의 배수인 값들만이 조건에 맞기 때문에 해당하는 값들의 개수를 세어 answer에 저장했다.
k의 배수인 값을 구하는 것은 최대 y좌표값을 k로 나눠서 얻었다.
최대 y좌표값이 3.342245, k가 2라면 1이 나올 것이다.
거기에 0은 포함되어 있지 않기 때문에 1을 더해주면 특정 x좌표에서 가질 수 있는 y좌표 개수를 구할 수 있다.
이후에는 그냥 Long 타입으로 적는 것과 sqrt를 쓰기위해 Double로 변환했었던 것만 추가되어있다.
해당 방법으로 작성한 코드는 다음과 같다.
import kotlin.math.sqrt
class Solution {
fun solution(k: Int, d: Int): Long {
var answer: Long = 0
val useD: Long = d.toLong()
val useK: Long = k.toLong()
for (i in 0..useD step useK) {
answer += (sqrt(((useD * useD - i * i).toDouble())) / useK).toLong() + 1
}
return answer
}
}
반응형
'Kotlin > Algorithm Problems' 카테고리의 다른 글
<프로그래머스> 테이블 해시 함수(Lv.2) (0) | 2024.01.05 |
---|---|
<프로그래머스> 멀쩡한 사각형(Lv.2) (1) | 2024.01.04 |
<프로그래머스> 숫자 카드 나누기(Lv.2) (1) | 2024.01.02 |
<프로그래머스> 시소 짝꿍(Lv.2) (2) | 2023.12.29 |
[프로그래머스] 수식 최대화(Lv.2) (0) | 2023.12.27 |