Python/알고리즘 문제 풀이

[코테] 연속된 수의 합

마이구미+ 2023. 4. 25. 09:57

<로직 고민>

  • 어렵군..
  • total을 num으로 나누면 몫이 result의 가운데 값이네
  • 가운데값은 정해졌으니 num-1개가 가운데를 중심으로  대칭이군
  • num이 짝수인 경우에는 가운데 값이 정수가 아니라 저기 포함되지 않고 그 값을 사이에 두는 정수가 가운데에서 왼쪽, 오른쪽에 위치하는군
  • num이 2고 total이 2인 경우는...어떻게 구할 수 있지....음.....
  • num이 3이고 total이 7인 경우는..? 4,5,6도 안 되고 5,6,7도 안 되는데...
  • 왜 num개의 연속된 수를 더해서 total이 될 수 없는 케이스는 없다고 하는거지.....
  • 뭐 여튼...num이 짝수일 경우와 홀수일 경우 나눠서 해야 하는 거 같긴 한데 일단 풀어보자
def solution(num, total):
    answer = []
    if num % 2 == 1:
        center = total // num
        start = center - ((num - 1)/2)
        end = center+((num-1)/2)
        for i in range(start, end+1):
            answer.append(i)
    else:
        left = total // num
        start = left - ((num - 1)/2)
        end = left + ((num - 1)/2) + 1
        for i in range(start, end+1):
            answer.append(i)

    return answer
  • 이렇게 하니까 start인지 end인지가 float 형식이라 for문에서 에러가 뜬다
  • num이 홀수일 때는 num-1은 짝수니까 항상 몫이 나누어 떨어질 거라 생각해서 그냥 /를 붙였는데 생각해보니 num이 짝수일 때는 num - 1이 홀수가 돼서 실수의 값이 나오는구나
  • 하고 else문 아래에만 /을 //로 고쳤는데 여전히 같은 에러가 뜬다
  • 에러가 몇 번째 줄에 있는지 자세히 보지 않았는데 처음부터 num이 홀수일 경우에서부터 걸렸다

  • 그냥 나누기 연산자(/)를 쓰면 몫이 딱 떨어지더라도 그 값은 실수 형태인 것 같다..아마도..? 그러니 안 되지....?
  • 나누기 연산자(/)를 다 몫 연산자(//)로 바꿨다

  • 실행은 했는데 원하는 값이 아니다
  • range()함수에 끝번호는 끝번호-1인가보다 range함수 정리했었는데 그새 까먹었다
  • end+1로 고쳐주고 실행했더니 원하는 값이 나왔다


<완성된 코드>

def solution(num, total):
    answer = []
    if num % 2 == 1:
        center = total // num
        start = center - ((num - 1)//2)
        end = center+((num-1)//2)
        for i in range(start, end+1):
            answer.append(i)
    else:
        left = total // num
        start = left - ((num - 1)//2)
        end = left + ((num - 1)//2) + 1
        for i in range(start, end+1):
            answer.append(i)

    return answer


print(solution(3, 12))  # [3, 4, 5]
print(solution(5, 15))  # [1, 2, 3, 4, 5]
print(solution(4, 14))  # [2, 3, 4, 5]
print(solution(5, 5))   # [-1, 0, 1, 2, 3]

<다른 사람 풀이>

- 천재풀이1

def solution(num, total):
    return [(total - (num * (num - 1) // 2)) // num + i for i in range(num)]
  • 이런 생각은 어디서 나오는 거지....?
  • 역시 수학적인 머리가 부족해서 난 이런 생각을 못 하는건가
  • 근데 사실......이해도 안 간다 ㅋㅋㅋㅋ
  • 이거 말고도 다른 풀이들 보는데 머리가 아프다
  • 심지어 내가 짠 것도 나중에 다시 보면 이게 뭐야...? 할 것 같다....
  • 아니 그래도 나는 변수명도 잘 설정해서 처음 봐도 나중에 봐도 대충 무슨 얘긴지 알 수 있을 거 같다 ㅋㅋ