[프로그래머스] Lv0.연속된 수의 합

싱숭생숭어·2023년 4월 16일

프로그래머스

목록 보기
2/21

문제

문제 설명

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

제한사항

1. 1 ≤ num ≤ 100
2. 0 ≤ total ≤ 1000
3. num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

입출력 예

numtotalresult
312[3, 4, 5]
515[1, 2, 3, 4, 5]
414[2, 3, 4, 5]
55[-1, 0, 1, 2, 3]

입출력 예 설명

입출력 예 #1

  • num = 3, total = 12인 경우 [3, 4, 5]를 return합니다.

입출력 예 #2

  • num = 5, total = 15인 경우 [1, 2, 3, 4, 5]를 return합니다.

입출력 예 #3

  • 4개의 연속된 수를 더해 14가 되는 경우는 2, 3, 4, 5입니다.

입출력 예 #4

  • 설명 생략

풀이과정

def solution(num, total):
    answer = []
    if num%2 == 0:
    #num의 개수가 짝수일때
        a = ((total//(num//2))+1)/2
        #중앙값 두개 중 더 큰 수 a
        for x in range(a-num//2,a+num//2):
            answer.append(x)
    else:
    #num의 개수가 홀수일때
        a = total/num
        #중앙값 a
        for x in range(a-(num-1)//2,a+(num+1)//2):
            answer.append(x)
    return answer

위 코드의 경우 실행 시
TypeError: 'float' object cannot be interpreted as an integer 에러가 발생한다. 이유는 /의 경우 몫을 반환해주는 연산자로,
4/2 => 2.0000000 이런식의 float값을 반환한다.

따라서 a에 int를 붙여주거나 //연산자를 활용해 몫을 정수형태로 반환해 range인자 안에 넣어주어야 했다. (위의 오류는 결국 range의 인자안에 정수형태가 아닌 형태를 넣어서 발생했던 것 !)

내 풀이

def solution(num, total):
    answer = []
    if num%2 == 0:
    #num의 개수가 짝수일때
        a = ((total//(num//2))+1)//2
        #중앙값 두개 중 더 큰 수 a
        for x in range(a-num//2,a+num//2):
            answer.append(x)
    else:
    #num의 개수가 홀수일때
        a = total//num
        #중앙값 a
        for x in range(a-(num-1)//2,a+(num+1)//2):
            answer.append(x)
    return answer

다른 풀이(참고)

def solution(num, total):
    answer = []
    a = 0

    if num % 2 == 0:
        a = int(total/num) - int(num/2 - 1)
        answer = list(range(a,num+a))
    else:
        a = int(total/num) - int(num/2)
        answer = list(range(a,num+a))

    return answer

이 풀이법도 본질적으론 나와 같은 방식의 풀이 접근방식이었지만 세부적으론 list(range())문을 사용해 for와 append를 사용한 내 방식보다 조금 효율적인 것 같아 적어놓았다.

def solution(num, total):
    b = total // num - (num - 1) // 2
    return list(range(b, b + num))

이 정도의 짧은 풀이법도 가능하다. 수학적인 머리만 잘 돌아간다면 ...

profile
공부합시당

0개의 댓글