[백준] 2961번 도영이가 만든 맛있는 음식

2024. 6. 18. 13:28· 동식이 취업시키기 작전/코딩테스트
목차
  1. 문제
  2. 고민
  3. 코드
728x90

문제

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

고민

우선,, 문제 이해가 안돼서 시작부터 난항이었다. 

 

신맛과 쓴맛으로 곱셈덧셈을 만드는 건가?라고 생각하고 입력/출력 예시를 보는데 도저히 떠오르지 않아서 GPT한테 예시좀 많이 뽑아달라고 찡찡댔다. ㅋㅋㅋ 알고보니 신맛과 쓴맛은 각각 계산 하는거더라^.^

 

심지어 예제 3번에는 아래에 어떻게 계산된건지 과정도 적혀있다.

 

1. 신맛, 쓴맛이 같이 입력된다 => tuple로 묶기

2. 신맛은 곱하기 쓴맛은 더하기로 계산한다. => 신맛은 1에다 누적 곱하기, 쓴맛은 0에다 누적 더하기

3. 입력된 맛 개수보다 많이 조합할 수 없다. => 입력된 맛 개수만큼 선택되면 탈출하기

4. n개에서 r개를 선택한다. => 조합(백트래킹)

위 조합으로 문제를 생각하고 풀었다.

 

코드

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BackTracking
{
	// 제가 보기 편하려고 class를 생성했습니다.
    // 실제로 이렇게 하지 않고 바로 tuple선언해도 됩니다.
    class Sour
    {
        private int sourSize;

        public int SourSize
        {
            get { return this.sourSize; }
        }

        public Sour(int size)
        {
            this.sourSize = size;
        }
    }

    class Bitter
    {
        private int bitterSize;

        public int BitterSize
        {
            get { return this.bitterSize; }
        }


        public Bitter(int size)
        {
            this.bitterSize = size;
        }


    }

    class 도영이가_만든_맛있는_음식
    {
        static int ingredient; // 재료 개수
        static (Sour, Bitter)[] ingredients;
        static int answer = int.MaxValue;
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Split(' '); // 재료 개수
            ingredient = int.Parse(input[0]);

            ingredients = new (Sour, Bitter)[ingredient]; // 재료 관리하는 배열 [(신맛, 쓴맛), (신맛, 쓴맛)]
            
            for (int i = 0; i < ingredient; i++) // 순회하면서 배열에 담기
            {
                input = Console.ReadLine().Split(' ');
                int sour = int.Parse(input[0]);
                int bitter = int.Parse(input[1]);

                ingredients[i] = (new Sour(sour), new Bitter(bitter));
            }

            BT(0, 0, 1, 0); // 레벨, 선택된 개수, 곱하기, 더하기
            Console.WriteLine(answer);
        }

        static void BT(int start, int count, int totalSour, int totalBitter) // start : 시작점, count : 선택된 수
        {
            if(start == ingredient)
            {
                if(count > 0) // 하나 이상 재료가 선택되었을 때만 계산
                {
                    int minus = Math.Abs(totalSour - totalBitter);
                    answer = Math.Min(answer, minus);
                }
                return;
            }


            // 선택
            BT(start + 1, count + 1, totalSour * ingredients[start].Item1.SourSize, totalBitter + ingredients[start].Item2.BitterSize);

            // 비선택
            BT(start+1, count, totalSour, totalBitter);
        }
    }
}

확실히 재귀가 너무 어렵다. 재귀 너무 헷갈리고 구현된 재귀 코드를 손코딩 하는건 가능하지만, 내가 그걸 구현하긴 너무 어렵다. 차라리 공식이 있으면 좋을텐데 그런 것도 없고. 계속 같은걸 풀다 보니 이런 느낌~? 으로 코드를 작성하는 지경에 이르렀다. 그러다 안되면 또 손코딩 하고,, 코딩 천재가 되고싶다.

저작자표시 비영리 변경금지 (새창열림)

'동식이 취업시키기 작전 > 코딩테스트' 카테고리의 다른 글

[백준] 2467번 용액  (1) 2024.06.19
[백준] 5568번 카드 놓기  (0) 2024.06.19
[백준] 1931번 회의실 배정(C#)  (1) 2024.04.11
[프로그래머스] 이진 변환 반복하기(C#)  (0) 2024.04.11
[프로그래머스] 덧칠하기(C#)  (0) 2024.04.09
  1. 문제
  2. 고민
  3. 코드
'동식이 취업시키기 작전/코딩테스트' 카테고리의 다른 글
  • [백준] 2467번 용액
  • [백준] 5568번 카드 놓기
  • [백준] 1931번 회의실 배정(C#)
  • [프로그래머스] 이진 변환 반복하기(C#)
이동식이
이동식이
개발자가 되고싶은 동식이... 티스토리를 시작하게 되었다.
이동식이
동식이의 공부상자
이동식이
전체
오늘
어제
  • 분류 전체보기 (116)
    • 동식이 취업시키기 작전 (74)
      • 코딩테스트 (43)
      • 알고리즘 (5)
      • Unity (7)
      • CS (1)
      • 1차 프로젝트 : Overcooked2 (4)
      • FPS - Penguin party(feat. u.. (4)
      • UNITY로 FPS GAME 개발(FEAT. 1인.. (3)
      • 기업프로젝트 : Hacsamo (3)
    • 알고리즘 (15)
      • 백준 (4)
      • 프로그래머스 (10)
    • 일기 (3)
      • 회고 (0)
      • 리뷰 (0)
    • 자격증 (7)
      • 실기 (3)
      • 1. 요구사항 확인 (4)
    • Project (11)
      • Team Project (4)
      • Personal Project (0)
      • 베어머더러 (0)
      • 빵빵빵 타이쿤 (7)
    • 기술 블로그 염탐 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기
  • 관리자

공지사항

인기 글

태그

  • system.action`1[t] callback) [0x00000] in <00000000000000000000000000000000>:0 at googleplaygames.ourutils.playgameshelperobject.update () [0x00000] in <00000000000000000000000000000000>:0 googleplaygames.ourutils.playgameshelperobject:update()
  • 자료구조
  • 파이썬
  • 아자아자 파이팅이닷!
  • 애인에겐 머리를 조아려 감사함
  • [play games plugin 0.10.14] 06-11-25 23:27:52 +09:00 error: server auth code and id token require web clientid to configured. googleplaygames.ourutils.playgameshelperobject:update() [play games plugin 0.10.14] 06-11-25 23:27:52 +09:00 error: exception l
  • 프로그래머스
  • 백준
  • Unity
  • Python
  • 배경스크롤링
  • 무한배경
  • Photon
  • c#
  • 슬픈 런타임에러 증후군
  • 개인정보수집유효기간
  • 코딩테스트
  • 유니티
  • 스택
  • 빵빵빵타이쿤

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
이동식이
[백준] 2961번 도영이가 만든 맛있는 음식
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.