파이썬 while문 간단한 질문 드립니다

조회수 830회

너무 기초적인 질문이라 답답하실 수도 있지만 도저히 해결책이 안나와서 이렇게 질문 드립니다

a=[0,1,2,3]
b=[2,3,4,5]
c=[]

while sum(c) < 3:
    for i in a:
        c.append(b[i])

print(c)

현재 이런 상황인데

제가 의도하는건 c리스트에 원소가 하나씩 들어가서 합이 3이 넘으면 (물론 예시기준입니다) c리스트에 그만 들어가게 하고 싶거든요... 근데 그게 적용이 안되네요 ㅠㅠ 혹시 어떻게 하는게 좋을까요 ㅠㅠ

2 답변

  • 주신 코드는 while 밑에서 a에 대해서 for를 별다른 조건 없이 돌리고 있습니다. 그러니 while이 한 번 돌 때마다 a 전체를 돌려서 c에 꽂고 그 다음을 진행해서 빠져나오게 되죠. 결과적으로는 b 전체가 c에 꽂히게 되고요.

    적당한 종결 조건을 주면 됩니다. 데모 확인해 보세요.

    # a = [0,1,2,3] // 사실 필요없음
    b = [0, 1, 1, 1, 4, 5]
    c = []
    
    # 아직 c의 원소의 합이 3을 안 넘을 때만 다음을 실행한다:
    while sum(c) < 3 :
        for i in b :
            # b의 원소를 하나 넣으려고 봤는데 이번에 넣는 것까지 합하면 3이 넘어버릴 경우
            if (sum(c) + i) > 3 :
                # for를 때려치움
                break
            # 안 넘을 것 같으면
            else :
                # 넣음
                c.append(i)
    
    print(c)
    # [0, 1, 1, 1]
    
  • 답글은 엽토군님이 설명까지 다 하셨으므로 전 번외(검색하는 누군가를 위해...)로 적습니다.

    functools 모듈에 reduce 라는 펑션이 제공됩니다. 이것의 역활은 1, 2, 3, 4 이라고 리스트가 있을 때 1 하고 2 를 더하고 그 결과를 다시 함수의 첫번째 인자로 보내고 다음 숫자를 두번째 인자로 줘서 계속 더하는 함수입니다.

    즉...((1 + 2) + 3) + 4) 이렇게 수행되는 함수입니다. 앞의 인수가 바로전 합값이므로 그것을 통해 비교할 수 있습니다.

    from functools import reduce
    
    b = [2, 3, 4, 5, 6, 7]
    limitNum = 15     # 제한크기
    reduce(lambda n, m: n + m if n < limitNum else n, b)    # 합이 15이하까지만 합산결과를 내줍니다.
    
    20
    
    • reduce 는 조건에 충족할 때 멈출 수 없고 결국 모든 요소를 순회하므로 좋은 방법이 될 순 없습니다. 그런용도의 함수도 아니고요.단지 위의 예제는 그런것도 있다....는 측면에서 보세요. 정영훈 2018.11.28 20:19

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)