파이썬 합이 10이 되게 하는 세 수치

조회수 753회

파이썬 코드 작성중인데 어떻게 접근해야할지 계속 고민하는데 여러분들의 고견 부탁드립니다. 방향성이라도 제시해주시면 감사하겠습니다.

코드 목표는 설정값 set_point를 맞추는 것입니다.

set_point = 10

unit1 = 6, unit2 = 3, unit3 = 5

unit1은 0~100% 제어 가능 : 0~6 사이 실수 가능

unit2는 0n/off만 가능(0% 혹은 100%) : 0 또는 3만 가능

unit3은 10%씩 제어 가능 : 0, 0.5, 1, ..., 5

예를들어, unit1=4.5 (75%출력), unit2=3 (100% 출력), unit3=3.5 (70% 출력) 총합이 set_point인 10이 되도록하는게 목표입니다.

이는 수 많은 경우의 수 중 하나입니다.

근데 경우의 수도 많고 어떻게 접근해야할지 고민입니다. decision tree를 사용해야할지... 각각의 유닛에 가능한 옵션을 다 구하고 조합하는 것도 생각해봤는데 unit 수가 점점 늘어나면 돌리는데 시간이 오래걸릴 거 같습니다.

부탁드립니다.

  • 총합이 무조건 10이 되어야 한다면 unit3의 0.5 단위는 의미가 없는거 아닌가요? 초보자 2020.12.1 09:22
  • 질문 수정했어요! 0.5여도 unit1에서 조절하면 총합을 10이 되게 할 수 있지 않을까요...? 알 수 없는 사용자 2020.12.1 09:29

2 답변

  • 모든 경우의 수를 구하는 것도 그리 어렵지 않습니다.

    for unit2 in [ 0, 3 ]:
        for u3 in range(0, 51, 5):
            unit3 = u3/10
            unit1 = 10 - unit2 - unit3
            set_point = unit1 + unit2 + unit3
            print( unit1, '|', unit2, '|',  unit3, '||', set_point)
    
    10.0 | 0 | 0.0 || 10.0
    9.5 | 0 | 0.5 || 10.0
    9.0 | 0 | 1.0 || 10.0
    8.5 | 0 | 1.5 || 10.0
    8.0 | 0 | 2.0 || 10.0
    7.5 | 0 | 2.5 || 10.0
    7.0 | 0 | 3.0 || 10.0
    6.5 | 0 | 3.5 || 10.0
    6.0 | 0 | 4.0 || 10.0
    5.5 | 0 | 4.5 || 10.0
    5.0 | 0 | 5.0 || 10.0
    7.0 | 3 | 0.0 || 10.0
    6.5 | 3 | 0.5 || 10.0
    6.0 | 3 | 1.0 || 10.0
    5.5 | 3 | 1.5 || 10.0
    5.0 | 3 | 2.0 || 10.0
    4.5 | 3 | 2.5 || 10.0
    4.0 | 3 | 3.0 || 10.0
    3.5 | 3 | 3.5 || 10.0
    3.0 | 3 | 4.0 || 10.0
    2.5 | 3 | 4.5 || 10.0
    2.0 | 3 | 5.0 || 10.0
    
    • 답변감사합니다. 많은 도움되었습니다. 한 가지 더 질문드리자면, 지금은 unit 수가 3개로 한정되어 있지만, unit 수가 정해지지 않았을 때 이를 일반화해서 코드를 만들 수 있을까요? unit 수가 100개가 되었을 때 set_point 값을 맞추기 위한 일반화된 형식이요 알 수 없는 사용자 2020.12.2 21:31
    • @꼬우 : 변수 100개라면, 모든 경우의 수를 다 확인하는데 어려움이 있을 수 있겠네요. 초보님의 답변처럼 진짜 랜덤하게 변수들을 뽑아서, f(u1, u2, u3, ... , u100) 의 결과값을 확인해보고, 가장 최적화되는 포인터 몇군데를 선별해서 주변을 전체탐색하는 방식으로 찾는 게 어떨까 싶네요. nowp 2020.12.2 21:41
  • 정확히 어떤걸 원하시는건지 모르겠지만 set_point 값이 고정되어있다면 대충 아래 방법을 적용하면 되지 않을까 싶어서 적어봅니다.

    import random
    set_point = 10
    unit1 = random.uniform(1,2,3,4,5,6)
    unit2 = random.uniform(0,3)
    unit3 = set_point - unit1 - unit2
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)