C - for문 활용 문제

조회수 386회
int overCheck(sum) 
{
    // 0원 이하로 내려갔는지 확인
    if (sum > 0) 
        return 1;
    else if (sum == 0) 
        return 0;
    else
        return -1;
}


int main(void)
{

    for (int i = 0; i < 8; i++) 
    {
        int money = 3500;
        money -= i * 500; // i = 500원 크림빵

        if (overCheck(money) >= 0) 
        {
            for (int j = 0; j < 6; j++) 
            {
                money -= j * 700; // j = 700원 새우깡

                if (overCheck(money) >= 0) 
                {
                    for (int k = 0; k < 9; k++) 
                    {
                        money -= k * 400; // k = 400원 콜라
                        if (overCheck(money) == 0)
                        {
                            printf("크림빵(500) : %d, 새우깡(700) : %d, 콜라(400) : %d\n", i, j, k);
                        }
                    }
                }
            }
        }

    }

}

최대한 간결하게 작성하려 했는데 난잡해 보일 수 있는 점 죄송합니다.

<문제>

500원 크림빵, 700원 새우깡, 400원 콜라를 이용하여 3500원을 남김없이 사용가능 한 경우를 출력하시오.

위와 같은 코드를 만들었는데, 7,0,0 밖에 나오지 않습니다. 왜그럴까요...? ㅠㅠ..

2 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    코드를 돌려본 것은 아니지만, 두번째와 세번째 for문에서 money값을 다시 초기화하지 않고 그대로 사용하는 것이 문제가 되었을 것 같습니다.

    첫 번째 for문에서는 3500원으로 초기화하는데, 이후의 for문에서는 money에서 500 * i를 뺀 money값을 반복적으로 사용합니다.

    예를 들어, i=1일 경우 money=3000 일 텐데, 이 때 j=0, k=1이 되면 money=2600이 됩니다.

    동일하게 i=1, j=0일 때 k=2가 되면 money=2200이 되어야 맞지만, 작성하신 코드상에서는 money=1800이 되어 원하는 값을 얻을 수 없게 됩니다.

    따라서 j, k 값과 무관하게 3500을 전부 사용할 수 있는 (7, 0, 0)만 정답으로 출력되는 것입니다.

    조금만 고민해 보시면 해결하실 수 있으실 거예요!

    • 감사합니다. 하나씩 디버그 해보면서 말씀하신 것을 이해했습니다. 제가 짠 코드로 하려면 money 변수를 할때마다 새로 초기화 해줘야 하네요. 많이 비효율적인 코드가 된거 같아 새로 고민 해보겠습니다. Will-Big 2020.3.11 12:00
  • 제가 작성한 코드 올려드려요 참고해보세요

    결과

    500원 0개, 700원 1개, 400원 7개

    500원 0개, 700원 5개, 400원 0개

    500원 1개, 700원 2개, 400원 4개

    500원 2개, 700원 3개, 400원 1개

    500원 3개, 700원 0개, 400원 5개

    500원 4개, 700원 1개, 400원 2개

    500원 7개, 700원 0개, 400원 0개

    #include "stdafx.h"
    
    #define WON_500 (500)
    #define WON_700 (700)
    #define WON_400 (400)
    
    #define WON_MAX (3500)
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int i, j, k;
        int sum = 0;
    
        for(i = 0;i < 100;i++)
        {
            for(j = 0;j < 100;j++)
            {
                for(k = 0;k < 100;k++)
                {
                    if(((i * WON_500) + (j * WON_700) + (k * WON_400)) == WON_MAX)
                        printf("500원 %d개, 700원 %d개, 400원 %d개\n", i, j, k);
    
    
                }
            }
        }
    
        while(1);
    
        return 0;
    }
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)