-
231023_JAVA_두 원 사이의 정수5. 그 외 공부/5.2 코딩테스트 2023. 10. 23. 14:03
x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.제한 사항
- 1 ≤ r1 < r2 ≤ 1,000,000
입출력 예
r1 : 2
r2 : 3
result : 20
그림과 같이 정수 쌍으로 이루어진 점은 총 20개 입니다.문제 : https://school.programmers.co.kr/learn/courses/30/lessons/181187
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
학창시절 수학문제로 자주 접했던 문제여서 풀어보았다.
그런데 하기와 같은 방법으로 풀어보았으나 자꾸 시간초과가 걸렸다.
public long solution(int r1, int r2) { long answer = 0; long lastNum = r2-r1+1; for (int i = 1; i<r2;i++){ for(int j =1; j<r2;j++){ int no = i*i+j*j; if(no>=r1*r1 && no<=r2*r2){ // System.out.println(i+","+j); answer+=1L; } } } answer = (answer+lastNum)*4; return answer; }
하.........어쩐지 잘풀린다 했다....;;;;;
풀이법을 보며 다시 풀어보았다.
public long solution(int r1, int r2) { long answer = 0; for(int x =1; x<=r2;x++){ int max = (int) Math.floor(Math.sqrt((long) r2 * r2 - (long) x * x)); int min = (int) Math.ceil(Math.sqrt((long) r1 * r1 - (long) x * x)); answer +=(max-min)+1; } answer = (answer)*4; return answer; }
- for문 안 인덱스 x를 1에서부터 r2 까지의 범위로 셋팅함
- 큰 반지름 과 작은반지름 사이의 원이기 때문에 각 r1, r2 넓이에서 x의 넓이를 빼주어 루트를 씌운 후
- r2는 Math.floor > 버림, r1은 Math.ceil > 올림 을 써주어 간단히 문제를 푸는 방식이었다..
- 그리고 가장 중요한건 int 범위초과를 발생시키게 하는 test 코드가 있어 r1, r2, x의 넓이를 구할시, long으로 강제 형변환 하였다.
'5. 그 외 공부 > 5.2 코딩테스트' 카테고리의 다른 글
221104_JAVA_코딩테스트 연습(푸드 파이트 대회) (0) 2022.11.04 221026_JAVA_코딩테스트 연습(카카오 성격 유형 검사) (0) 2022.10.26 220801_JAVA_코딩테스트 연습(아이디 신고) (0) 2022.08.03 220730_JAVA_코딩 테스트 문제(신규 아이디 추천)ver2 (0) 2022.07.30 220505_JAVA_코딩 테스트 문제(없는 숫자 더하기) (0) 2022.05.05