프로그래머스_Python_오답노트_n보다 커질때까지 더하기_while 조건문과 for if 조건문 비교

HEE·2025년 4월 5일
0
post-thumbnail

1. 프로그래머스 python 코딩테스트 입문

Level 0. n보다 커질 때까지 더하기

정수 배열 numbers와 정수 n이 매개변수로 주어집니다. numbers의 원소를 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 이때까지 더했던 원소들의 합을 return 하는 solution 함수를 작성해 주세요.

오답 확인 (1, 2, 3 비교)

1. while 오답

def solution(numbers, n):
    a = 0
    while a < n:
        for i in numbers:
            a = a + i
    return a
  • 나의 의도 : while a < n 인 동안, for에서 i를 <하나씩>만 꺼내서 a + i 를 하고, 다시 while 조건을 보고, for 에서 i를 하나만 꺼내서 a + i 를 하고, 그러다 a > n 이면 즉시 return 한다.
  • 오답 이유
    while a < n 동안, 조건 도는데, for문은 <<리스트의 모든 요소가 다 돌때까지 진행>> 이라서, 중간에 막아주는 조건도 없기 때문에, 한번에 다 리스트에 있는 i를 순차적으로 a+i를 진행한 후, 리스트 모든 요소 덧셈이 끝난 뒤, while조건을 다시 보고, 만약 작으면 리스트 전체를 다시 또 더하고, 아니면 return하는것.
    즉 하나씩 더하고 비교하기가 안됨.
    참고, while 사용한 정답
def solution(numbers, n):
    a = 0
    index = 0  # 리스트에서 값을 가져오기 위한 인덱스 초기화

    while a <= n:  # a가 n보다 커질 때까지 반복
        a += numbers[index]  # 현재 인덱스의 값을 a에 더하기
        index += 1  # 다음 값을 가져오기 위해 인덱스를 증가
    return a

2. for if 오답

def solution(numbers, n):
    a = 0
    for i in numbers:
        if a < n: 
            a = a + i
    	else:
        	return a 
  • 이 경우, a = a + i 하고, 이때의 a가 n보다 커질 수 있다.
    그런데 바로 return되지 않고, 커진a를 데리고 한번 더 if문을 돌렸을때, 그때 false로 넘어가서 else로 넘어가고, return이 된다.
    즉 a가 커진 후 바로 return되는게 아니라, if 조건을 보고, else로 넘어가서 return a 가 된다.
  • 즉 의도가 다름.

3. for if 오답

def solution(numbers, n):
    a = 0
    for i in numbers:
        if a < n:
            a = a + i
    return a
  • for문a>n을 만족했을때도 계속 돌아가는게 문제임.
  • 아니 a>n이 되면, if에서 할게 없어서 바로 return되는게 아니냐? 생각하는데,
    if문 안에 return이 없으니 계속 for문만 돌아감.
    for문 - 리스트 안의 i를 확인하는 작업
    if문 - 조건일때, 값을 더할지 말지만 정해주는것. a<n 일때 더하는 역할일 뿐, a>n이면 가만히 있음. 단지 값을 더하지 않을 뿐임.
    따라서 결과는 for문이 i를 모두 확인 한 후, a값이 return됨.

정답

def solution(numbers, n):
    a = 0
    for i in numbers:
        a = a + i 
        if a > n: 
            return a
  • 이건 먼저 더하고, if문 조건상 작으면 더하고 작으면 더하고, 커지면 그 후에 if에서 a가 n보다 큰 경우 즉시 return하는 코드라서 가장 깔끔하다.
  • for문도 여러번 돌지 않고, retrun으로 즉시 종료된다.
profile
ALL IS WELL

0개의 댓글