문제 설명 및 입출력 예시
두 정수 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;
int cnt = 0;
for (int i = left; i <= right; i++) {
for (int j = 1; j <= i; j++) {
if(i % j == 0) {
System.out.println("i = " + i + " j = " + j);
cnt++;
System.out.println("cnt = " + cnt);
}
}
if(cnt % 2 == 0){
answer += i;
}
else
answer -= i;
cnt = 0;
}
return answer;
}
}
약분되는 횟수를 카운트해주는 cnt를 선언하고 약분이 될시 cnt를 ++ 해준다.
만약 cnt가 짝수라면 i ( 계산해야되는 값)을 더해주고 홀수라면 빼준다.
그리고 cnt를 초기화 해주고 처음부터 for문을 다시 돈다.
회고
약수로 계산만 할줄알지 진짜 약수 자체의 개수를 카운트하는 법에 대해서 뇌절이 와버렸다.
그러다가 생각난게 증감 연산자였다. 만약 약수로 계산이 된다면 증감 연산자의 증가 연산을 이용해 약수의 개수를 카운팅 해줄 수 있을 것이라고 생각했고 그 예측은 들어맞았다. 그 후 이중 포문을 이용해서 0부터 left ~ right값까지 나머지를 계산해주고 마지막으로 홀수라면 - 짝수라면 +를 할 수 있게 만들어줬다.
💻프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/77884
'실력 향상 일지 > 프로그래머스' 카테고리의 다른 글
[Java] 부족한 금액 계산하기 (0) | 2022.11.09 |
---|---|
[Java] 행렬의 덧셈 (0) | 2022.11.07 |
[Java] 문자열 다루기 기본 (0) | 2022.11.01 |
[Java] 문자열 내림차순으로 배치하기 (0) | 2022.10.31 |
[Java] 내적 (0) | 2022.10.30 |