상세 컨텐츠

본문 제목

백준# 2961 - 도영이가 만든 맛있는 음식

C#/알고리즘

by McRobbin 2020. 5. 13. 11:57

본문

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

 

2961번: 도영이가 만든 맛있는 음식

문제 도영이는 짜파구리 요리사로 명성을 날렸었다. 이번에는 이전에 없었던 새로운 요리에 도전을 해보려고 한다. 지금 도영이의 앞에는 재료가 N개 있다. 도영이는 각 재료의 신맛 S와 쓴맛 B��

www.acmicpc.net

재귀호출로 분류된 2961 - 도영이가 만든 맛있는 음식 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace _2961
{
    class Program
    {
        public class Cook
        {
            public static List<Cook> cooks;
            public static int totalCount;
            public static int minDiff;
 
            public int count;
            public int sour;
            public int bitter;
 
            public Cook(int sour, int bitter, int count = 0)
            {
                this.count = count;
                this.sour = sour;
                this.bitter = bitter;
            }
 
            public static Cook operator +(Cook c1, Cook c2)
            {
                return new Cook(c1.sour * c2.sour, c1.bitter + c2.bitter, c1.count + 1);
            }
 
            public static void Recur(Cook c, int index)
            {
                if(index == totalCount)
                {
                    if(c.count != 0)
                    {
                        int diff = Math.Abs(c.sour - c.bitter);
                        minDiff = minDiff > diff ? diff : minDiff;
                    }
                    return;
                }
 
                else
                {
                    Recur(c, index + 1);
                    c.count++;
                    Recur(c + cooks[index], index + 1);
                }
 
            }
        }
      
        static void Main(string[] args)
        {
            Cook.cooks = new List<Cook>();
            Cook.totalCount = int.Parse(Console.ReadLine());
            Cook.minDiff = int.MaxValue;
 
            for(int i = 0; i < Cook.totalCount; i++)
            {
                int[] input = Console.ReadLine()
                    .Split(' ').Select(x => int.Parse(x)).ToArray();
                Cook.cooks.Add(new Cook(input[0], input[1]));
            }
 
            Cook.Recur(new Cook(10), 0);
 
            Console.WriteLine(Cook.minDiff);
        }
    }
}
 
 
cs

Cook이라는 클래스를 하나 정의했습니다.

 

신맛, 쓴맛이 있고 요리를 하나도 섞지 않을 경우를 대비해 카운트를 하나 넣었습니다.

계산을 편하게 하려고 연산자 오버로딩을 사용했습니다.

Cook c1 + Cook c2 를 더할 경우 둘의 신맛은 곱하고 쓴맛은 더하도록 했습니다.

 

해결 방법 입니다.

ex)

4

1 7

2 6

3 8

4 9

 

처음 1 7의 요리를 만난다면 도영이가 할 수 있는건 두가지로 나뉩니다. 이 요리를 섞거나 안섞거나.

섞은 상태에서 진행할 수 있고 섞지 않고 진행할 수 있습니다.

 

다음 2 6의 요리를 만나면 마찬가지로 이 요리를 섞거나 섞지 않거나 둘로 나뉩니다.

두번째 요리까지 진행하면 4가지의 결과가 나올 수 있습니다.

1 : 선택, 2 : 선택 / 1 : x, 2 : 선택 / 1 : x, 2 : x / 1 : 선택, 2 : x

 

3번째 3 8 또한 마찬가지 입니다. 요리를 섞거나 안섞을 수 있습니다.

이 2번 요리에서 나올 경우의 수 * 2가지의 경우가 나옵니다.

 

 

이것을 일반화 시키면 현재 요리를 섞거나 섞지 않은 상태 그대로 그 뒤를 쭉 진행시켜 봐야 한다는 것입니다.

그것을 재귀로 호출해주고 각 재귀호출 된 메서드는 만난 요리를 섞거나 섞지 않음을 분기하고

반복하며 마지막 까지 진행합니다.

 

재귀된 메서드가 끝에 도달했다면 자신이 섞은 요리의 맛이 담겨있을 것이고 아무것도 안섞인게 아니라면

그 맛을 최소 맛차이와 비교해 업데이트 하면 되겠습니다.

 

최초 재귀 호출시 맛을 1, 0으로 세팅하고 진행했습니다.

'C# > 알고리즘' 카테고리의 다른 글

백준# 7569 - 덩치  (0) 2020.05.13
백준# 4811 - 알약  (0) 2020.05.13
백준# 1019 - 책 페이지  (0) 2020.05.11
백준# 1074 - Z  (0) 2020.05.10
백준#1377 - 버블 소트  (0) 2020.05.09

관련글 더보기