본문 바로가기
JAVA/Coding Test Study

[Lv.2] 점 찍기 : Java

by ♡˖GYURI˖♡ 2024. 4. 5.
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

이해하기

첫 접근방식은 다음과 같았다.

  • x축을 0으로 놓고 가능한 y 좌표값을 구한다.
  • y축을 0으로 놓고 가능한 x 좌표값을 구한다.
  • x, y축을 이동시켜가며 서로의 좌표값을 구한다.
  • 구한 좌표값들은 중복되지 않도록 set에 저장한다.

하지만 구현하다보니 뭔가 잘못되었다는 것을 직감했다...

내가 짠 코드대로라면 x가 0일 때, y가 0일때, x가 k일 때, y가 k일 때의 경우만 구해지는 것이다.

k의 배수이고 d보다 작거나 같을 때를 구해야 하는 것인데...!

 

결국 오늘도 구글링🥹

처음 참고한 글은 요기⬇️

 

프로그래머스 점찍기 (Java)

문제 링크회사 생활을 즐긴다고 글을 정말 오랜만에 쓰는 것 같다머릿속에서 문제를 그려봤는데, 반지름 d인 원이 있음1.1 x,y축 포함 "1사분면에서 점이 얼마나 찍히는가?"를 묻더라좌표평면위의

velog.io

이 분의 접근 방식은 다음과 같았다.

  • 반지름이 d인 원 내부에서 1사분면에 해당하는 점의 개수를 구하는 문제
  • 좌표평면 위의 원에 x = k라는 직선을 그어서 만나는 점(정수) 밑으로 k만큼 거리를 둔 점이 몇 개 찍히는지 구하기
  • 제곱근 구할 때 long으로 형변환할 것

원을 그릴 생각은 못했는데 아차 싶었다.

 

두번째 참고한 글은 요기⬇️

 

[프로그래머스] 점 찍기 (Java)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근 방

maicoding.tistory.com

이 글에서는 위와 같은 방식을 좀 더 자세하게 설명하였다. 

  • 각 x좌표에 대해 최대 y좌표값을 구한다.
  • 최대 y를 maxY라고 지칭하면 피타고라스 정리에 의해 다음과 같은 식이 나온다.
    • x ^ 2 + maxY ^ 2 = d ^ 2
    • maxY = Math.sqrt(d * d - x * x)
  • 이렇게 구한 maxY를 k로 나눈 뒤 1을 더한다.
    • 이때 1은 (x, 0)도 포함시키기 위해서 더해주는 것이다.

 

 

문제풀이

class Solution {
    public long solution(int k, int d) {
        long answer = 0;
        
        for (long x = 0; x <= d; x += k) {
            long maxY = (long) Math.sqrt((long)d * d - (long)x * x);
            answer += maxY / k + 1;
        }

        return answer;
    }
}

 

생각보다 수학적으로 접근하면 쉽게풀리는 문제였다.

한 가지 주의할 점은 위에서 말했듯이 제곱근 구할 때 long으로 형변환할 것이었다.

이 부분을 빼먹어서 실패가 계속 떴었다.

'JAVA > Coding Test Study' 카테고리의 다른 글

[Lv.3] 입국심사 : Java  (0) 2024.04.05
[Lv.3] 징검다리 건너기 : Java  (0) 2024.04.05
[Lv.2] 시소 짝꿍 : Java  (0) 2024.04.03
[Lv.3] 불량 사용자 : Java  (0) 2024.04.02
[Lv.2] 소수 찾기 : Java  (0) 2024.04.02