본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 약수의 개수와 덧셈(C#)

by jyppro 2023. 8. 5.

약수의 개수와 덧셈

이번에는 월간 코드 챌린지 시즌2 출제문제인 "약수의 개수와 덧셈"을 다뤄보도록 하겠습니다.

 

문제 설명

두 정수 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 해야 합니다.

 

시작 코드

using System;

public class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        return answer;
    }
}

 

나의 풀이

using System;

public class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        for(int i = left; i <= right; i++)
        {
            int cnt = 0;
            for(int j = 1; j <= i; j++) { if(i%j == 0) { cnt++; } }
            if(cnt % 2 == 0){answer += i;}
            else{answer -= i;}
        }
        return answer;
    }
}

 

코드 분석

int형 left, right가 주어지며 시작합니다. for문으로 left에서 right까지 돌리며, 그 안에서 int형 cnt를 선언합니다. 다시 for문을 만들어 1에서 i까지 돌리고 그 안에 if문으로 i를 j로 나눈 나머지가 0이라면 cnt가 증가하도록 했습니다. for문을 빠져나와 다시 if문을 만납니다. cnt를 2로 나눈 나머지가 0이면 answer에 i를 추가해줍니다. 만약 아니라면 i를 빼줍니다. 모든 과정을 거쳤다면 answer를 리턴해줍니다.

 

풀이 설명

이번 문제에서 요구하는 것은 left와 right 사이에서 약수의 개수를 홀짝으로 판별하여 홀이면 빼고, 짝이면 더한 식을 거친 수 answer를 리턴하는 것입니다. 이번에는 이중for문이 사용되었습니다. 첫번째 for문은 left부터 right까지의 수를 돌리기 위한 용도이고, 두번째 for문은 약수의 개수를 계산하기 위한 용도입니다. 두번째 for문에서 left와 right 사이의 수들의 약수의 개수 계산이 끝났다면, if else 문을 통해 홀짝을 판별해 줍니다. 짝수면 answer에 더하고, 홀수면 빼준다음 최종적으로 answer를 리턴하며 식은 끝이 납니다.

 

<NEXT>

오늘은 월간 코드 챌린지 시즌2 출제문제 중 하나인 "약수의 개수와 덧셈" 문제를 풀어보았습니다. 다음에는 "문자열 내림차순으로 배치하기" 문제를 다뤄보도록 하겠습니다. 감사합니다.