SQL/PROGRAMMERS

2024-05-18 [Programmers Kotlin 코틀린 약수의 개수와 덧셈]

Glen_check 2024. 5. 18. 23:01

CASE (약수의 개수와 덧셈)

문제설명

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

 

제한사항

  • 1 ≤ left ≤ right ≤ 1,000

입출력 예시

left = 13 / right = 17일 경우 result는 43입니다.

 

문제 풀이

class Solution {
    fun solution(left: Int, right: Int): Int {
        var answer: Int = 0
        var storage = left

        while (storage != right+1) {
            var i = 0
            val list = mutableListOf<Int>()
            while (storage != i) {
                i++
                if (storage % i == 0) {
                    list.add(i)
                } else {
                    continue
                }
            }
            if (list.size % 2 == 0) {
                answer += storage
            } else {
                answer -= storage
            }
            storage++
        }
        return answer
    }
}

문제를 풀기 전, 어떻게 풀지 글로 정리해 본 내용은 아래와 같습니다.

 

1. left에서 right까지 while 문을 통해 반복합니다. (left의 값이 right의 값과 동일해질 때까지 풀이를 반복합니다.)

2. 0을 저장한 변수 i가 left를 저장한 변수 storage의 값과 동일해질 때까지 풀이를 반복하며,

만약 storage 값을 i로 나눴을 경우 나머지가 0이라면 list에 해당 값을 추가 (나누어 떨어질 경우 약수가 되기 때문)해주고, 아닐 경우 풀이를 지속적으로 진행합니다.

(while문을 한 번 반복할 때마다 i에 값을 1씩 ++)

3. list의 길이가 짝수일 경우 (약수의 갯수가 짝수일 경우) answer에 해당 값을 더해주고, 아닐 경우 해당 값을 빼줍니다.

4. storage 에 1씩 더해주면서 해당 과정을 지속적으로 반복합니다.

 

해당 내용을 코드로 다음과 같이 작성해 보았으며 코드를 작성하면서 몇 번 문제를 틀렸는데 원인은 다음과 같았습니다.

 

1. 변수 i를 어디서 선언하는지

변수 i를 while 문 밖에서 선언할 경우 storage 값이 변하더라도 i값이 초기화되지 않기 때문에 전체를 감싸고 있는 while문안으로 위치 수정하였습니다.

2. "i++" 를 어디에 정의하는지

 while (storage != right+1) {
            var i = 1
            val list = mutableListOf<Int>()
            while (storage != i) {
                if (storage % i == 0) {
                    list.add(i)
                } else {
                    continue
                }
                i++
            }

변수 i 관련 처음 잘못 작성한 코드는 다음과 같습니다.

 

처음 변수 i의 값을 1로 정의하고, while 문 마지막 부분에 풀이를 한 번 종료할 때 마다 1씩 더해가는 방식으로 작성해 보았으나, 문제는 else 문 내 continue를 활용하여 else로 나올 경우 'i++' 까지 도달하지 못하고 다시 while 문 첫부분으로 돌아가 무한루프가 발생하였습니다.

그래서 i 초기값을 0으로 변경하고, 'while (storage != i)' 첫 부분에 'i++'를 넣어 if, else 상관없이 해당 while문이 한 번 끝이 날 때마다 지속적으로 i에 1씩 더해갈 수 있도록 수정하였습니다.

 

내가 작성해 본 풀이는 while 문 안에 while 문이 들어가고 또 그 안에 if 문이 들어가고, 전체를 감싸고 있는 while 문 안에도 if 문이 들어가다보니 변수를 어디서 선언해야 할지, 순서를 어떻게 가져가야 할지 다소 헤맨 것 같습니다.

Intellij를 활용하며 중간중간 디버깅을 해보면서 어디서 의도대로 흘러가지 않는지 파악하고 변수의 위치나, 조건을 변경했기 때문에 문제를 풀 수 있었으나 코드의 흐름에 대해 조금 더 디테일하게 생각해보아야 할 것 같습니다!