[프로그래머스] 점 찍기 - JAVA

조유정·2023년 2월 2일
0

코딩테스트

목록 보기
9/31

[프로그래머스] 코딩테스트 연습 > 연습문제 > 점 찍기

문제 설명

좌표평면을 좋아하는 진수는 x축과 y축이 직교하는 2차원 좌표평면에 점을 찍으면서 놀고 있습니다. 진수는 두 양의 정수 k, d가 주어질 때 다음과 같이 점을 찍으려 합니다.

  • 원점(0, 0)으로부터 x축 방향으로 ak(a = 0, 1, 2, 3 ...), y축 방향으로 bk(b = 0, 1, 2, 3 ...)만큼 떨어진 위치에 점을 찍습니다.
  • 원점과 거리가 d를 넘는 위치에는 점을 찍지 않습니다.

예를 들어, k가 2, d가 4인 경우에는 (0, 0), (0, 2), (0, 4), (2, 0), (2, 2), (4, 0) 위치에 점을 찍어 총 6개의 점을 찍습니다.

정수 k와 원점과의 거리를 나타내는 정수 d가 주어졌을 때, 점이 총 몇 개 찍히는지 return 하는 solution 함수를 완성하세요.

제한사항

  • 1 ≤ k ≤ 1,000,000
  • 1 ≤ d ≤ 1,000,000

입출력 예

kdresult
246
1526

풀이

처음에 접근한 방식은
가능한 x, y 좌표값에 대해서, 원점과의 거리가 d보다 작은지를 확인하는 것이었다.

근데 시간초과
d값이 어마무시한데
이걸 이중 반복문을 도니까 시간초과가 났다,,,

이중 반복문을 피해야 한다.
일단 최대로 가질 수 있는 거리인 d 값은 정해져있다.
x값에 따른 최대 y값을 구한 뒤,
어차피 y는 k배 단위로 가질 수 있으니까 k로 나누어준다.

그러면 해결!

🔽 실패한 코드

class Solution {
	public long solution(int k, int d) {
    	long answer = 0;
        
        double x = 0, y = 0, distance;
		for (long i = 0; i <= d; i++) {
			for (long j = 0; j <= d; j++) {
				x = i * k;
				y = j * k;
				
				distance = Math.sqrt(Math.pow(x,2) + Math.pow(y,2));
				if (distance > d) 
					break;
				
				answer++;
			}
		}
        
        return answer;
    }
}

코드

class Solution {
    public long solution(int k, int d) {
        long answer = 0;
        
		long maxy = 0; // 최대로 가질 수 있는 y
		for (long x = 0; x <= d; x += k) {
			// 좌표 x와 최대 거리 d에 대하여 최대로 가질 수 있는 y를 구한다.
			maxy = (long) Math.sqrt(Math.pow(d, 2) - Math.pow(x, 2));
			// k배 단위로 y값을 가질 수 있으므로 k로 나눈 뒤 1을 더한다.
			answer += (maxy / k) + 1;
		}
        
        return answer;
    }
}
profile
나는 아직 멍청하다

0개의 댓글