✔ 점 찍기
문제 분석하기
(x, y)에 대해서 d보다 작으면서 0부터 + k씩 만큼에 대해 원의 방정식을 사용해 d를 넘지 않는지 확인하도록 함
예) k = 1, d = 5
1 * 0, 1 * 1, 1* 2, 1 * 3, 1 * 4, 1* 5 = 0, 1, 2, 3, 4, 5
0 → x가 0일 때 가질 수 있는 최대 y 값은 √(5² - 0²) = √(25 - 0)이며 y도 k씩 만큼 커지므로 √25 / k + 1(0, 0) = 6
(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5)
1 → x가 1일 때 가질 수 있는 최대 y 값은 √(5² - 1²) = √(25 - 1)이며 y도 k씩 만큼 커지므로 √24 / k + 1(1, 0) = 5
(1, 0), (1, 1), (1, 2), (1, 3), (1, 4)
2 → x가 2일 때 가질 수 있는 최대 y 값은 √(5² - 2²) = √(25 - 4)이며 y도 k씩 만큼 커지므로 √21 / k + 1(2, 0) = 5
(2, 0), (2, 1), (2, 2), (2, 3), (2, 4)
3 → x가 3일 때 가질 수 있는 최대 y 값은 √(5² - 3²) = √(25 - 9)이며 y도 k씩 만큼 커지므로 √16 / k + 1(3, 0) = 5
(3, 0), (3, 1), (3, 2), (3, 3), (3, 4)
4 → x가 4일 때 가질 수 있는 최대 y 값은 √(5² - 4²) = √(25 - 16)이며 y도 k씩 만큼 커지므로 √9 / k + 1(4, 0) = 4
(4, 0), (4, 1), (4, 2), (4, 3)
5 → x가 5일 때 가질 수 있는 최대 y 값은 √(5² - 5²) = √(25 - 25)이며 y도 k씩 만큼 커지므로 √0 / k + 1(5, 0) = 1
(5, 0)
손으로 풀어보기
- 0부터 시작하여 d보다 작을 때까지 + k씩 더해가며 가능한 수를 찾도록 함
- 원의 방정식을 사용해 d를 넘지 않는지 확인하도록 함
슈도코드 작성하기
k(정수)
d(원점과의 거리)
answer(점의 총 갯수)
for(x -> 0부터 d까지 k씩 증가) {
maxY(x일 때의 최대 y 값) = Math.sqrt(Math.pow(d, 2) - Math.pow(x, 2));
(maxY / k) + 1만큼 answer 증가
}
answer 반환
코드 구현하기
/**
* 140107) 점_찍기
*/
public class L086_140107 {
// k(정수)
// d(원점과의 거리)
public long solution(int k, int d) {
// answer(점의 총 갯수)
long answer = 0;
for (int x = 0; x <= d; x += k) {
// maxY(x일 때의 최대 y 값)
// x² + y² = d² → y² = d² - x²
long maxY = (long) Math.sqrt(Math.pow(d, 2) - Math.pow(x, 2));
// (maxY / k) + 1만큼 answer 증가
answer += (maxY / k) + 1;
}
// answer 반환
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L086_140107 solution = new L086_140107();
int k = 1;
int d = 5;
long result = solution.solution(k, d);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[147354] 테이블 해시 함수 (0) | 2024.02.08 |
---|---|
[142085] 디펜스 게임 (0) | 2024.02.07 |
[138476] 귤 고르기 (0) | 2024.02.05 |
[135807] 숫자 카드 나누기 (0) | 2024.02.05 |
[134239] 우박수열 정적분 (0) | 2024.02.04 |