알고리즘 CODEKATA 22 (두 정수 사이의 합)

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

CODEKATA

목록 보기
22/57

문제 설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.

예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.


제한 조건

  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소관계는 정해져있지 않습니다.

내 풀이

최종 풀이

class Solution {
    fun solution(a: Int, b: Int): Long {
        
        var answer: Long = 0
        
        var min = kotlin.math.min(a,b)
        var max = kotlin.math.max(a,b)
        
      
        for(i in min .. max){
            answer += i
        }
         
        
        return answer
    }
}

내가 푼 과정

  1. 일단 a 랑 b 사이에 속한 모든 정수를 컬렉션으로 묶고 컬렉션 요소를 합하면 되지않을까? 생각
var list = listOf(a in b)
        
        println(list)

이렇게 리스트 만들어지나 해봤는데 안됨.

a 랑 b 사이의 수를 어떻게 넣지?

for(i in a .. b){
            list.add{i}
        }

for 문 사용해서 i가 a랑 b 범위에 포함되면 list에 i를 추가하면 되지 않을까? 생각했는데 안됨

아 ; 괄호를 {}를 씀 ()쓴 줄 알았는데;

      for(i in a .. b){
            list.add(i)
        }
        
        println (list)
        
        return answer

그래서 이렇게 했더니 a가 b 보다 큰 경우에는 안됨.

if(a<=b){
            for(i in a .. b){
                list.add(i)
            }
        }else{
            for(i in b.. a){
                list.add(i)
            }
      
        }
        
        
        println (list)

그래서 그냥 에라모르겠다 if 문 써봄. 근데 뭔가 또 다른 사람 풀이 보면 더 효율적인 방법이 있을 것만 같다..

class Solution {
    fun solution(a: Int, b: Int): Long {
        var answer: Long = 0
        
        var list = mutableListOf<Int>()
    
        
        if(a<=b){
            for(i in a .. b){
                list.add(i)
            }
        }else{
            for(i in b.. a){
                list.add(i)
            }
      
        }
        
        answer = list.sum().toLong()
        
        return answer
    }
}

냅다 그냥 sum으로 더하고 long으로 변환해주면 안되나? 했는데

반은 맞고 반은 틀리다함

근데 어떤 경우에 틀리는건지가 안나와서 어디서 잘못됐는지를 모르겠다

이런 저런 시도 해봐도 다 반은맞고 반은 틀리다 나와서 GPT선생님 도움을 받았다..

해당 코드에서 테스트 실패의 원인은 아마도 특정 입력 값이 주어졌을 때 리스트를 사용한 접근 방식에서 발생하는 성능 문제나 작은 실수일 가능성이 큽니다. 특히, 매우 큰 범위의 숫자를 다룰 때 리스트에 모든 숫자를 추가하는 방식은 비효율적일 수 있습니다. 리스트를 사용하지 않고 직접 합계를 계산하는 방법이 더 효율적입니다.

라는 답변을 받았다.

class Solution {
    fun solution(a: Int, b: Int): Long {
        
        var answer: Long = 0
        
        var min = kotlin.math.min(a,b)
        var max = kotlin.math.max(a,b)
        
      
        for(i in min .. max){
            answer += i
        }
         
        
        return answer
    }
}

GPT 말듣고 생각해보니 진짜 굳이 list에 저장할 필요가 없었는데 최근 문제가 다 배열에 저장해야하는 방식이였다보니까 내 뇌가 list에 절여져 있었나봄.

이렇게 하니까 통과됐다.

list에 들어가면서 뭔가 잘못되었나??? 컴퓨터가 그래도 되는거임? 컴퓨터는 신인줄 알았는데..


다른 사람 풀이

class Solution {
    fun solution(a: Int, b: Int) =
        if (a < b) ((a..b).average() * (b - a + 1)).toLong()
        else if (a > b) ((b..a).average() * (a - b + 1)).toLong()
        else a.toLong()
}

a와 b의 평균값 * a와 b 중에 큰 수에서 작은 수+1을 뺀 값 을 해도 구해지나보다 수학적인 공식이 있었나보다. 수포자는 생각할 수 없는 방식..


여담

문제 풀 때 매몰된 사고 하지 않기....

profile
오리너구리입니다

0개의 댓글