ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 2839번 설탕 배달
    Algorithm Study/Python 2024. 7. 1. 23:23

     

    https://www.acmicpc.net/problem/2839

     

     

     

    풀이

    이번 문제는 copliot을 활용하여 문제를 풀어봤다.
    단순한 문제라면 질문을 잘하면 코드를 만들 수 있을 것 같았다.

    결과는 생각보다 놀랍게 2번의 질문 만으로 완성된 코드를 만들어냈다. 

    입력에 대한 부분은 일부 수정이 필요했지만 결과물을 잘 만들어서 생각보다 놀라웠다.

    먼저 copliot에게 질문을 하기 위해서는 이 문제가 원하는 요구사항을 이해해야한다.

    위 문제에서는 3과 5를 이용하여 입력받은 숫자를 만들 수 있는지 필요하고 그 숫자를 만들기 위해서는 3과 5를 최소로 사용한 값이 필요하다. 또 만들 수 없는 경우에는 -1을 출력하게 하였다. 그래서 위 조건으로 아래처럼 코드를 생성하였다.

    내가 입력 받은 숫자 N이 3과 5의 합으로 만들 수 있는 숫자인지 판별한다. 3과 5를 사용한 갯수가 최소가 될 수 있게 구현하려고 하는데 3과 5의 합으로 만들 수 없는 숫자라면 -1을 출력하고 만들 수 있다면 사용된 3과 5의 갯수의 총합을 출력하는 코드를 작성하시오

     

    def check_sum(n):
        if n < 3 or n == 4:
            return -1
    
        count_3 = n // 3
        while count_3 >= 0:
            remainder = n - (count_3 * 3)
            if remainder % 5 == 0:
                count_5 = remainder // 5
                return count_3 + count_5
            count_3 -= 1
    
        return -1
    
    # Test the function
    num = int(input())
    result = check_sum(num)
    print(result)

    위 처럼 코드를 만들어줬다.
    위 코드의 문제점은 먼저 3을 검사하기 때문에 15와 같은 입력이 들어왔을 때 5*3으로 3개가 아닌 3*5로 5개가 나온다.
    즉 만들 수 있는지는 판별할 수 있지만 최소값이 되지는 못한다.

     

    그래서 이번에는
    사용한 3과 5의 합이 최소가 될 수 있게 수정해달라는 요구를 했다.

    def check_sum(n):
        if n < 3 or n == 4:
            return -1
    
        count_5 = n // 5
    
        while count_5 >= 0:
            if (n - (count_5 * 5)) % 3 == 0:
                count_3 = (n - (count_5 * 5)) // 3
                break
            count_5 -= 1
    
        if count_5 < 0:
            return -1
    
        return count_3 + count_5
    
    # Test the function
    number = int(input())
    result = check_sum(number)
    print(result)

    먼저 3으로 판별하던 것을 5로 판별하는 것으로 바뀌면서 사용한 3과 5의 합이 최소가 될 수 있게 구하였고
    실제 수식은 N보다 작은 5의 배수 중 가장 큰 수(x)를 설정하고 나머지가 3으로 나눠지는지 확인
    -> 나눠지지 않는다면 하나 더 작은 5의 배수를 선택(x-5)하고 나머지가 3으로 나눠지는지 확인
    이런식으로 문제를 구현하였다.

    단순한 문제였고 요구사항을 만족하게 설명하는 것이 쉬웠기 때문에 2번의 질문으로 구현할 수 있었지만
    더 복잡한 문제가 나오면 더 많은 수정이 필요할 것 같긴하다.

    하지만 어떻게 잘 요구사항을 전달하냐가 AI를 잘 활용하는 방법이라고 생각하기 때문에 copliot을 사용하는 방법도 연습해둬야할 것 같다.

     

     

    전체 코드 (copliot)

    def check_sum(n):
        if n < 3 or n == 4:
            return -1
    
        count_5 = n // 5
    
        while count_5 >= 0:
            if (n - (count_5 * 5)) % 3 == 0:
                count_3 = (n - (count_5 * 5)) // 3
                break
            count_5 -= 1
    
        if count_5 < 0:
            return -1
    
        return count_3 + count_5
    
    # Test the function
    number = int(input())
    result = check_sum(number)
    print(result)

     

     

    전체 코드 (다른 버전)

    def check_combination(num):
        answer = 0
        
        while(num%5 != 0 and num >= 3):
            num -= 3
            answer += 1
    
        if num % 5 == 0:
            answer += num // 5
    
        if num == 0 or num%5 == 0:
            print(answer)
        else:
            print(-1)
    
    
    check_combination(int(input()))

    직접 풀었던 코드도 추가해봤다.

    'Algorithm Study > Python' 카테고리의 다른 글

    [백준] 10431번 줄세우기  (0) 2024.07.17
    [백준] 1009번 설탕 배달  (0) 2024.07.11
    [백준] 1940번 주몽  (1) 2024.03.22
    [백준] 31416번 가상 검증 기술  (0) 2024.03.22
    [백준] 9655번 돌 게임  (0) 2024.03.17

    댓글

From BlackHair