[프로그래머스]Level 1 : 약수의 개수와 덧셈(JAVA)

2021. 6. 6. 19:09·코딩 테스트/Java
반응형
약수의 개수와 덧셈
문제 설명

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항
  • 1 ≤ left ≤ right ≤ 1,000

 

입출력 예
left right result
13 17 43
24 27 52

 

입출력 예 설명

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
수  약수 약수의 개수
13 1, 13 2
14 1, 2, 7, 14 4
15 1, 3, 5, 15 4
16 1, 2, 4, 8, 16 5
17 1, 17 2
  • 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
수 약수 약수의개수
24 1, 2, 3, 4, 6, 8, 12, 24 8
25 1, 5, 25 3
26 1, 2, 13, 26 4
27 1, 3, 9, 27 4
  • 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.
코드
class Solution {
    public int solution(int left, int right) {
        int answer = 0;

        for(int i=left; i<=right; i++){
            int count = 0;

            for(int j=1; j<=i; j++){
                if(i%j==0){
                    count++;
                }
            }

            if(count%2==0){
                answer += i;
            }else{
                answer -= i;
            }
        }

        return answer;
    }
}
해설

2중 for문을 사용해서 1번째 for문은 left숫자부터 right까지, 2번째 for문은 1부터 left의 값까지 반복하여 약수를 찾는다. 약수의 개수를 count 하여 count값이 짝수면 더해주고 홀수면 마이너스해준다.

 

여러 가지의 풀이를 보고 비교해보던 중, 인상 깊은 코드가 있었다.

Math클래스의 sqrt 메서드를 통해서 간단하게 구현한 경우이다.

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        
        for(int i = left; i <= right; i++){
            if(Math.sqrt(i) - (int)Math.sqrt(i) > 0.0001) answer += i;
            else answer -= i;
        }
        
        return answer;
    }
}

만약 left : 16, right : 18 인 경우 

Math.sqrt(15) : 3.872983346207417 - 3 = 0.001 이상

약수 : 1, 3, 5, 15

 

Math.sqrt(16) : 4.0 - 4 = 0.001 미만

약수 : 1, 4, 16

 

Math.sqrt(17) : 4.123105625617661 - 4 = 0.001 이상

약수 : 1, 17

 

즉, sqrt메서드로 제곱근을 구해서 (int) 형 제곱근을 뺄셈을 해주는데, 16처럼 약수의 개수가 홀수인 경우엔 제곱근이 정수로 딱 떨어지게 된다. 약수의 개수가 홀수인 경우엔 sqrt - (int) sqrt의 수가 0.001보다 이상인 경우이다.

 

출처 : 프로그래머스, https://programmers.co.kr/learn/courses/30/lessons/77884

반응형
저작자표시 (새창열림)

'코딩 테스트 > Java' 카테고리의 다른 글

[프로그래머스]Level 1 : 서울에서 김서방 찾기(JAVA)  (0) 2021.06.06
[프로그래머스]Level 1 : 문자열 내 p와 y의 개수(JAVA)  (0) 2021.06.06
[프로그래머스]Level 1 : 제일 작은 수 제거하기(JAVA)  (0) 2021.06.01
[프로그래머스]Level 1 : 수박수박수박수박수박수?(JAVA)  (0) 2021.05.27
[프로그래머스]Level 1 : 평균 구하기(JAVA)  (0) 2021.05.23
'코딩 테스트/Java' 카테고리의 다른 글
  • [프로그래머스]Level 1 : 서울에서 김서방 찾기(JAVA)
  • [프로그래머스]Level 1 : 문자열 내 p와 y의 개수(JAVA)
  • [프로그래머스]Level 1 : 제일 작은 수 제거하기(JAVA)
  • [프로그래머스]Level 1 : 수박수박수박수박수박수?(JAVA)
:j
:j
ddongjunn@gmail.com
dev.jddongjunn@gmail.com
  • :j
    dev.j
    :j
  • 전체
    오늘
    어제
    • :j
      • 프로그래밍 언어
        • Java
        • html
        • JavaScript
        • XML
        • JSON
        • CSS
        • jQuery
        • Web
        • k8s
        • JPA
      • 프레임워크
        • Spring
      • 코딩 테스트
        • Java
      • 네트워크
        • CCNA
      • 데이터베이스
        • Mssql
        • Oracle
      • 회고
      • :j story
      • CS
  • 블로그 메뉴

    • 홈
    • 태그
    • github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Name
    HAVING
    항해솔직후기
    오버라이딩
    MSSQL
    항해백앤드
    다형성
    class
    오버로딩
    id
    항해99
    <br>
    항해플러스
    지역변수
    멤버변수
    항해플러스백앤드
    항해플러스백엔드
    group by
    appendChild
    Queue
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
:j
[프로그래머스]Level 1 : 약수의 개수와 덧셈(JAVA)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.