개발조각

[프로그래머스] 약수의 개수와 덧셈 본문

알고리즘🅰/프로그래머스

[프로그래머스] 약수의 개수와 덧셈

개발조각 2022. 2. 9. 18:03
728x90
반응형

2021.10.02에 푼 문제입니다.

 

이 문제 풀긴 풀었는데 제출 후 채점하기에서 테스트 1번이 계속 틀려서 결국 저보다 코드 훨 잘 치는 남친님한테 SOS 해서 해결했습니다...😢

 

간단하게 풀 수 있는 문제인데...

제가 겉멋만 들어서 reduce, map, for of 이런 거 쓰다가 산으로 갔어요...

충분히 쉽게 풀 수 있는걸 제가 왜 그렇게 풀었는지 모르겠네요.😢

기초가 중요하다는 거 다시 한번 반성 또 반성합니다...😂

 


해결방안

function solution(left, right) {
    var answer = 0;
    
    for(let i=left; i<= right; i++){
        let count = 0;
        for(let j=1; j< i+1; j++){
            if(i % j == 0) count++;
        }
        count % 2 == 0 ? answer += i : answer -= i
    }
    return answer;
}

 

해결방안 순서

  1. for문을 사용해서 left부터 right값을 추출합니다.
  2. for문안에 for문을 넣어주어 두번째 for문에서는 left~right값의 약수 개수를 구합니다.
  3. 두 번째 for문에서 구해준 약수 개수를 가지고 짝수이면 더해주고 홀수이면 빼줍니다.

 

1단계. for문을 사용해서 left부터 right값을 추출합니다.

for(let i=left; i<= right; i++)

테스트 1
left = 13; right 17
for(let i=left; i<= right; i++) -> i = 13, 14, 15, 16, 17

테스트 2
left = 24; right 27
for(let i=left; i<= right; i++) -> i = 24, 25, 26, 27

 

2단계. for문안에 for문을 넣어주어 두 번째 for문에서는 left~right값의 약수 개수를 구합니다.

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

  • count : 약수의 개수를 나타내는 변수
  • for(let j=1; j< i+1; j++) : 1부터 첫 번째 for문으로 들어오는 숫자까지 반복(13이 들어왔으면 1~13까지 반복)
  • i % j == 0 : 약수를 구하는 방법
  • if(i % j == 0) count++; : 약수의 개수를 카운터 하기

 

첫 번째 for문에서 i = 13일 경우

count = 0;

두 번째 for문에서 j=1

i % j == 0 -> 13 % 1 == 0 -> true

count++ -> count = 1;

 

두번째 for문에서 j=2

i % j == 0 -> 13 % 2 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=3

i % j == 0 -> 13 % 3 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=4

i % j == 0 -> 13 % 4 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=5

i % j == 0 -> 13 % 5 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=6

i % j == 0 -> 13 % 6 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=7

i % j == 0 -> 13 % 7 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=8

i % j == 0 -> 13 % 8 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=9

i % j == 0 -> 13 % 9 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=10

i % j == 0 -> 13 % 10 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=11

i % j == 0 -> 13 % 11 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=12

i % j == 0 -> 13 % 12 == 0 -> false

count = 1; 그대로

 

두번째 for문에서 j=13

i % j == 0 -> 13 % 13 == 0 -> true

count++ -> count = 2;

 

 

테스트 1
left = 13; right 17
13 -> count = 2; (1, 13)
14 -> count = 4; (1, 2, 7, 14)
15 -> count = 4; (1, 3, 5, 15)
16 -> count = 5; (1, 2, 4, 8, 16)
17 -> count = 2; (1, 17)

테스트 2
left = 24; right 27
24 -> count = 8; (1, 2, 3, 4, 6, 8, 12, 24)
25 -> count = 3; (1, 5, 25)
26 -> count = 4; (1, 2, 13, 26)
27 -> count = 4; (1, 3, 9, 27)

 

3단계. 두 번째 for문에서 구해준 약수 개수를 가지고 짝수이면 더해주고 홀수이면 빼줍니다.

여기서는 간단하게 삼항조건 연산자를 사용해주었습니다.

count % 2 == 0 ? answer += i : answer -= i

  • count % 2 == 0 : 조건 -> 약수 개수가 짝수인지 홀수 있지
  • answer += i : true
  • answer -= i : false
테스트 1
left = 13; right 17
13 + 14 + 15 - 16 + 17 = 43

테스트 2
left = 24; right 27
 24 - 25 + 26 + 27 = 52

여기까지 프로그래머스 약수의 개수와 덧셈 해결방안에 대해 설명해보았습니다.

728x90
반응형

'알고리즘🅰 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 소수 만들기  (0) 2022.02.11
[프로그래머스] 실패율  (0) 2022.02.11
[프로그래머스] 예산  (0) 2022.02.09
[프로그래머스] K번째수  (0) 2022.02.09
[프로그래머스] 내적  (0) 2022.02.08
Comments