Game Develop

[Algorithm] Baekjoon 2590번 : 색종이 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 2590번 : 색종이

MaxLevel 2023. 3. 6. 23:05

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

 

2590번: 색종이

<그림 1>과 같이 정사각형 모양을 한 여섯 종류의 색종이가 있다. 1번 색종이는 한 변의 길이가 1cm이고, 차례대로 그 길이가 1cm씩 커져, 6번 색종이의 한 변의 길이는 6cm가 된다. <그림 1> 주어진 색

www.acmicpc.net

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    int n, temp;
    vector<int> v(1);
    int result = 0;
 
    for (int i = 1; i <= 6++i)
    {
        cin >> temp;
        v.push_back(temp);
    }
 
    result += v[4+ v[5+ v[6]; // 한장을 붙이려면 무조건 새로운 판을 사용해야함.
 
    // 5짜리 처리
    v[1-= v[5* 11// 1*1짜리 사용해서 붙일 수 있는만큼 붙이기.
 
    // 4짜리 처리
    v[2-= v[4* 5// 2짜리 먼저 다 붙이고
    if (v[2< 0// 2짜리가 부족했다면. 
    {
        // 부족한 2짜리만큼 1짜리를 더 넣어보기.
        // v[2]에는 지금 더 붙일 수 있는 2*2짜리의 개수가 들어있음. 즉, 1*1짜리를 v[2] * 4만큼 더 넣을 수 있다.
        
        v[1-= v[2* 4 * -1;
        v[2= 0;
    }
 
    // 3짜리 처리
    result += v[3/ 4;
    v[3] %= 4;
 
    if (v[3> 0// 새 판에 1개이상,3개이하 붙여져있는 상태다.
    {
        ++result;
 
        if (v[3== 1)
        {
            // 1짜린7개, 2짜린 5개
            v[1-= 7;
            v[2-= 5;
        }
        else if (v[3== 2)
        {
            // 1짜린6개, 2짜린 3개
            v[1-= 6;
            v[2-= 3;
        }
        else if (v[3== 3)
        {
            // 1짜린5개, 2짜린 1개
            v[1-= 5;
            v[2-= 1;
        }
 
        if (v[2< 0// 2가 부족했었으면, 즉 1을 더 붙일 수 있는 상황이라면
        {
            v[1-= v[2* 4 * -1;
        }
    }
 
    // 2짜리 처리
    if (v[2> 0// 아직까지도 남아있다면..
    {
        result += v[2/ 9;
        v[2] %= 9;
 
        if (v[2> 0// 1개 ~ 8개 사이
        {
            ++result; // 새로운 판 꺼내오고
            int extraSpace = 36 - 4 * v[2]; // 1*1을 붙일 수 있는 여분의 공간
            v[1-= extraSpace;
        }
    }
 
    if (v[1> 0// 아직까지도 남아있다면
    {
        result += v[1/ 36;
        v[1] %= 36;
 
        if (v[1> 0++result;
    }
 
    cout << result;
}
cs

 

반 하드코딩식으로 해결한 문제. 다른사람풀이들도 대부분 그러긴 한데, 몇몇개에선 깔끔하게 푼 사람도 있었다.

크기가 최대 6까지밖에 없어서 가능했던 것 같다.