TIL/kotlin 알고리즘

프로그래머스 lv2 점 찍기

crablo 2024. 4. 11. 09:58
728x90

해당문제를 풀면서 노트에 그려보면서 문제를 이해했다.

a와 b는 0,1,2,3,4...  이렇게 1씩 차이나는 수열이라고 생각한다면

주어진 k와 d를 이용해서 점을 찍어나가면

a*k  => x축방향                 b*k  =>  y축방향

이때 d의 거리 반경 내에 있어야한다.

그래서 d = 4라고할때 위의 사진처럼 좌표를 4이내로 찍었다.

그랬더니, 결과적으로

(0, 0), (0, 2), (0, 4), (2, 0), (2, 2), (4, 0) 위치에 점을 찍어 총 6개의 점을 찍었다.

 

그래서 코드상에서는 x축방향으로 0부터 d 범위까지 k 만큼 건너뛰면서 점을 찍는다고 생각했고,

마찬가지로 y도 0부터 d범위까지 k만큼 건너뛰면서 점을 찍는다고 생각했다.

다음과 같이 코드를 작성하였으나 시간초과로 실패하였다.

아무리 풀어도 내머리로는 한계가 있어서 다른사람의 코드를 참고했다.

그중에서 내풀이와 비슷한 코드를 보았다.

내코드는 실패했으니 해당 코드를 보면서 공부하기로 했다.

 for (i in 0..d step k)   

나와 동일하게 for반복문을 사용하여 0~d까지 k 간격으로 변수 i를 반복했다.

 answer += (sqrt((d.toDouble() * d - i.toDouble() * i)) / k).toLong() + 1

먼저 d.toDouble() * d - i.toDouble() * i 는 현재 i에 대한 x^2 + y^2 = d^2의 y값을 나타낸다.

sqrt((d.toDouble() * d - i.toDouble() * i))는 해당 점의 y값을 구하는 것이고.

(sqrt((d.toDouble() * d - i.toDouble() * i)) / k)  는 k로 나누어 점의 갯수를 계산하며 소수점이하는 버리고

Long타입으로 변환한다.

+1을 더하는 이유는 현재 위치에서의 점의 개수를 전체 점의 개수에 더해야해서 현재 위치의 점도 포함해야하므로 1을 더해주는 것이다.

결과적으로 정답이었고, 생각을 더 많이 해야겠다.

728x90