코딩 테스트/프로그래머스
[프로그래머스] 점 찍기
sangjin98
2024. 4. 4. 17:25
반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/140107
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 분석
[제한사항]
- 1 ≤ k ≤ 1,000,000
- 1 ≤ d ≤ 1,000,000
문제를 풀기 쉽게 요약하면 위에 그림처럼 k=2, d=6 으로 주어졌을 때 파란점의 개수를 구해야 하는 문제이다.
문제 접근
주어진 k 와 d 모두 최대 10^6 까지 가능하다.
그렇기 때문에 최악의 경우 k=1, d=10^6 일 경우에는 가능한 모든 좌표들을 하나하나 확인하며 거리 비교를 할 수 없다 (시간 초과)
그렇다면 공식을 세워서 문제를 풀어야 한다.
x = 0, y= 4 일 때, 해당 y축 (x=0) 에 가능한 좌표는 4 / 2 + 1 개이다.
즉, (x, 가능한 y 최대 값) 일 때, 해당 y 축에 가능한 좌표는 y 최대값 / k + 1 이다.
y의 최대값만 구하면 가능한 x 값들을 순회하면 모든 가능한 좌표를 구할 수 있다.
주의할 점은 계산 하면서 int 자료형의 크기를 넘어갈 수 있기 때문에 중간 계산도 long 자료형으로 바꾸어서 계산해주어야 한다.
코드
import java.util.*;
class Solution {
public long solution(int k, int d) {
long answer = 0;
long y = d;
for(long x=0; x<=d; x+=k){
while(x * x + y * y > (long)d * d){
y -= 1;
}
answer += y/k + 1;
}
return answer;
}
}
반응형