[프로그래머스] 정수 제곱근 판별

2024. 10. 14. 01:27·여러가지/알고리즘 & 자료구조

프로그래머스 정수 제곱근 판별 문제: 다양한 풀이 방법 심층 분석

문제 요약

주어진 양의 정수 n이 어떤 양의 정수 x의 제곱인지 판별하는 문제입니다. 만약 n이 x의 제곱이라면 x+1의 제곱을, 아니면 -1을 반환하는 함수를 구현해야 합니다.

풀이 1: 제곱근을 이용한 판별

코드:

class Solution {
    public long solution(long n) {
        double sqrt = Math.sqrt(n);

        // 제곱근이 정수인지 확인
        if (sqrt % 1 == 0) {
            long root = (long) sqrt;
            return (root + 1) * (root + 1);
        } else {
            return -1;
        }
    }
}

설명:

  • 장점: 간결하고 직관적이며, Math.sqrt() 함수를 이용하여 효율적으로 계산합니다.
  • 단점: double형을 사용하기 때문에 부동소수점 오차가 발생할 가능성이 미세하게 존재합니다.

풀이 2: 뉴턴-랩슨법

코드:

class Solution {
    public long solution(long n) {
        double x = n;
        while (Math.abs(x * x - n) > 0.0001) { // 정확도 조절
            x = (x + n / x) / 2;
        }

        long root = (long) x;
        return root * root == n ? (root + 1) * (root + 1) : -1;
    }
}

설명:

  • 아이디어: 뉴턴-랩슨법을 이용하여 제곱근을 근사적으로 구합니다.
  • 장점: 빠른 수렴 속도를 보이며, 정확도를 조절할 수 있습니다.
  • 단점: 구현이 복잡하며, 초기값에 따라 수렴하지 않을 수 있습니다.

각 풀이의 시간 복잡도 및 공간 복잡도

  • 제곱근: O(1) / O(1)
  • 뉴턴-랩슨법: 일반적으로 O(log n)에 수렴하지만, 초기값과 함수의 특성에 따라 달라질 수 있습니다. / O(1)

어떤 풀이를 선택해야 할까요?

  • 간단하고 빠른 풀이: 제곱근을 이용한 방법이 가장 간단하고 일반적인 경우에 충분히 빠릅니다.
  • 정확성: 뉴턴-랩슨법은 빠른 수렴 속도를 보이지만, 부동소수점 오차가 발생할 수 있습니다.

결론적으로, 대부분의 경우 제곱근을 이용한 방법이 가장 적합하지만, 문제의 요구사항이나 추가적인 조건에 따라 다른 방법을 선택할 수 있습니다.

추가 고려 사항

  • 정수 범위: 문제에서 주어진 정수 범위를 고려하여 자료형을 선택해야 합니다.
  • 정밀도: 부동소수점 오차를 최소화하기 위해 필요한 경우 정밀도를 높이는 방법을 사용할 수 있습니다.
  • 코드 가독성: 코드를 작성할 때 가독성을 높이기 위해 변수명을 명확하게 하고, 주석을 적절히 사용해야 합니다.

이 외에도 다양한 풀이 방법과 최적화 기법이 존재합니다. 문제의 조건과 요구사항에 맞게 적절한 방법을 선택하여 문제를 해결해야 합니다.

궁금한 점이 있다면 언제든지 질문해주세요.

이진 탐색에 대한 설명을 제외하고, 제곱근과 뉴턴-랩슨법을 중심으로 풀이를 설명했습니다. 이진 탐색은 별도로 다루는 것이 좋으며, 각 풀이의 장단점을 명확하게 비교하여 선택할 수 있도록 했습니다.

저작자표시 (새창열림)

'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글

[프로그래머스] 두 정수 사이의 합  (2) 2024.10.14
[프로그래머스] 하샤드 수  (0) 2024.10.14
[프로그래머스] 정수 내림차순으로 배치하기  (1) 2024.10.14
[프로그래머스] 자연수 뒤집어 배열로 만들기  (0) 2024.10.14
[프로그래머스] 문자열 내 p와 y의 개수  (1) 2024.10.14
'여러가지/알고리즘 & 자료구조' 카테고리의 다른 글
  • [프로그래머스] 두 정수 사이의 합
  • [프로그래머스] 하샤드 수
  • [프로그래머스] 정수 내림차순으로 배치하기
  • [프로그래머스] 자연수 뒤집어 배열로 만들기
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (284)
      • 여러가지 (108)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (2)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 운영체제 (0)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (5)
        • 암호화폐 (5)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    AWS
    완전탐색
    celery
    프로그래머스
    ecs
    Spring Boot
    Spring WebFlux
    자바
    WebFlux
    항해99
    spring
    reactor
    파이썬
    Docker-compose
    Python
    취업리부트
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    OOP
    백준
    Redis
    mybatis
    FastAPI
    RDS
    SAA
    EC2
    시험
    java
    docker
    DP
    그리디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[프로그래머스] 정수 제곱근 판별
상단으로

티스토리툴바