본문 바로가기

알고리즘/프로그래머스

[프로그래머스]Lv.1 약수의 합

https://school.programmers.co.kr/learn/courses/30/lessons/12928

 

프로그래머스

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

programmers.co.kr


문제

  • 정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한사항

  • n은 0 이상 3000이하인 정수입니다.

입출력 예제

설계과정

1. 약수를 구한다.

2. 구한 약수들을 전부 더한다.


풀이과정

1. Math.sqrt() 를 사용해서 시간 복잡도를 낮춘 for문을 작성한다.

  • Math.sqrt() : 제곱근을 구하는 함수이다.
  • 약수의 모든 경우의 수를 구하면 값이 클수록 시간이 오래 걸리므로 제곱근을 통해 시간을 줄인다.

2. N % i 가 나누어 떨어지면 약수이다.

 

3. 약수 중에서 제곱근일 경우에는 answer에 i를 더한다.

  • 자기 자신(i)을 결과에 더한다.

4. 약수 중에서 제곱근이 아닐 경우에는 answer에 i와 N을 i로 나눈 몫을 더한다.

  • 4로 예를 들면 i를 통해 1이 더해지고, N / i를 통해 4가 더해져서 answer의 결과는 5가 된다.

답안소스

  • 프로그래머스
class Solution {
    public int solution(int n) {
        int answer = 0;

        for(int i=1; i<=Math.sqrt(n); i++) {
            if(n % i == 0) {

                if(i * i == n) {
                    answer += i;
                } else {
                    answer += i;
                    answer += n / i;
                }
            }
        }
        return answer;
	}
}

  • 이클립스
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Measure {

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int answer = 0;
			
			for(int i=1; i<=Math.sqrt(N); i++) {
				if(N % i == 0) {
					if(i * i == N) {
						answer += i;
					} else {
						answer += i;
						answer += N/i;
					}
				}
			}
			System.out.println(answer);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}