알고리즘 CODEKATA 09 (짝수의 합)

오리너구리·2024년 5월 17일
0

CODEKATA

목록 보기
9/57

문제 설명

정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.


제한 사항

0 < n ≤ 1000


내 풀이

class Solution {
    fun solution(n: Int): Int {
        var answer: Int = 0
        var condition = n in 1..1000
        
        if (condition){
            for(i in 2..n step(2)){
            answer += i
        }
        }
       
        return answer
    }
}

내가 해결했던 의식의 흐름

일단 보자마자 어떻게 접근해야 되는지 바로 감이 안 옴.

그러고 보니 수학이랑(사실 공부랑) 이별 한지 10주년 이였다.

드디어 멍청이는 바로 감 안 오는 단계가 왔나 보다~~!

일단 반복문을 써야 할 것 같아서 for 문 문법을 다시 찾아봄

for문 기본 문법

for (item in collection) {

    // 반복할 코드
}

Ex)

for (i in 1..10) { // 1부터 10까지 반복
	println ("$i" )
	}

for (i in 1..변수){ // 1부터 변수까지 반복
	println ("$i" )
	}

for (i in 1 until 변수){ //1부터 변수 바로 전 까지 반복
	println ("$i" )
	}

찾아보니까 step 이나 downTo를 사용할 수도 있다.

step : 증가 값을 변경하는 키워드 (step에는 음수는 들어갈 수 없음)

step(2) > 2씩 증가

step(3) > 3씩 증가

for (i: Int in 1..10 step(2)) { 
	println ("$i" ) // 1,3,5,7,9
	}

downTo: 순서를 큰 값 에서 작은 값으로 변경하는 키워드

for (i in 10 downTo 1) { 
	println ("$i" ) // 10,9,8,7,6,5,4,3,2,1
	}
	

for(i in 10 downTo 1 step(2)) {
	println ("$i") //10,8,6,4,2
	}

step을 사용하면 되나?

근데 그럼 짝수는 ?

시작을 2부터 하면 되나?

더하는 식 어떻게 짜야하지?

복합 대입 연산자를 쓰면 될 것 같음

  1. += : 두 항을 더한 후 왼쪽 항에 대입함 ex) a += b
  2. -= : 왼쪽 항을 오른쪽 항으로 뺀 후 왼쪽 항에 대입함 ex) a -= b
  3. *= : 두 항을 곱한 후 왼쪽 항에 대입함 ex) a *= b
  4. /= : 왼쪽 항을 오른쪽 항으로 나눈 후 왼쪽 항에 대입함 ex) a /= b
  5. %= : 왼쪽 항을 오른쪽 항으로 나머지 연산 후 왼쪽 항에 대입함 ex) a %= b

이렇게 했더니 해결 할 수 있었당.


다른 사람 풀이

class Solution {
    fun solution(n: Int) = (0..n).filter { it % 2 == 0 }.sum()
}

.filter와 2로 나눈 나머지가 0 이면 짝수라는 사실을 활용해서 이렇게 간단하게 풀 수도 있었음..

근데 나는 일단 .filter와 .sum() 의 존재조차 몰랐기 때문에

class Solution {
    fun solution(n: Int): Int {
        var answer: Int = 0

        for (i: Int in 0..n) {
            if (i % 2 == 0) {
                answer += i
            }
        } 
        return answer
    }
}

이렇게 했어야 할 듯?

class Solution {
    fun solution(n: Int): Int {
        var result = 0
        var input = n
        
        while(input>0) {
            if(input%2==0) {
                result += input    
            }
            input --
        }
        return result
    }
}

이렇게 while 문을 사용한 분도 있었다.

근데 굳이 n을 input이라는 변수로 한번 더 선언 한 이유를 잘 모르겠음!

while문을 아직 잘 몰라서 그런가???

그래서 Chat GPT 쌤한테 여쭤보고 이해했다

n 을 그대로 사용하면 n값이 변경되면서 혹시나 다른 데에서 n을 사용한다면 문제가 될 수도 있으니까 따로 빼서 한거였음~! 알고 보니 당연한 건데 혼자는 이유를 떠올릴 수 없는 멍청이의 한계~!

class Solution {
    fun solution(n: Int): Int {        
        val half = n / 2
        var answer: Int = half * (half + 1)
        return answer
    }
}

이렇게 반복문 없이 푼 분도 있었다.

이거 어떻게 되는 거지???? 뭔가 엄청 수학적인 느낌임.

그냥 수학에서 짝수의 합을 구하는 방법을 알고 있는 사람은 이렇게 쉽게도 풀 수 있었나 보다

이것도 내 머리로 왜 되는지 모를 것 같아서 똑똑한 GPT 선생한테 물어봤다

어떻게 동작하는가?

  1. val half = n / 2:
    • n을 2로 나눈 몫을 계산합니다. 이는 n 이하의 짝수의 개수를 나타냅니다.
    • 예를 들어, n이 10이라면 half는 5가 됩니다 (짝수는 2, 4, 6, 8, 10이므로 5개).
  2. var answer: Int = half * (half + 1):
    • 이는 1부터 half까지의 모든 정수의 합을 구하는 공식입니다. 짝수는 2의 배수이기 때문에 2 * (1 + 2 + ... + half)와 같습니다.
    • 1 + 2 + ... + halfhalf * (half + 1) / 2이므로, 여기에 2를 곱한 형태가 half * (half + 1)입니다.
    • 예를 들어, half가 5라면 1 + 2 + 3 + 4 + 5 = 15이므로 2 * 15 = 30이 됩니다.

예시

  • n = 10일 때:
    • half = 10 / 2 = 5
    • 짝수는 2, 4, 6, 8, 10 (총 5개)
    • answer = 5 * (5 + 1) = 5 * 6 = 30
  • n = 7일 때:
    • half = 7 / 2 = 3
    • 짝수는 2, 4, 6 (총 3개)
    • answer = 3 * (3 + 1) = 3 * 4 = 12

나머지 공부

(다른 사람 풀이를 보면서 몰랐던 함수나 키워드 등 더 공부할 목록 적어두기)

  1. .filter
  2. .sum
  3. while 문 문법
profile
오리너구리입니다

0개의 댓글