본문 바로가기
Develop/백준 (Cpp)

[백준] 3967번 : 매직스타 (C++)

by Tarra 2024. 2. 16.

3967번 : 매직스타


문제)

매직 스타는 1부터 12까지 숫자가 헥사그램(hexagram)에 채워져 있는 모양으로 이루어져 있다.

 

 

매직 스타의 이름에 매직이 들어가는 이유는 숫자 네 개로 이루어진 줄의 숫자를 모두 합하면 26이 되기 때문이다. 위의 그림의 여섯 줄에 쓰여 있는 숫자는 다음과 같다.

  • 1 + 4 + 10 + 11
  • 11 + 5 + 3 + 7
  • 7 + 6 + 12 + 1
  • 2 + 10 + 5 + 9
  • 9 + 3 + 6 + 8
  • 8 + 12 + 4 + 2

매직 스타를 채우는 방법은 여러 가지가 있다. 일부만 채워진 매직 스타가 주어졌을 때, 수를 전부 다 채워서 매직 스타를 만드는 프로그램을 작성하시오.

 

 

 

 

입력 :

매직 스타의 모양이 주어진다. 수가 채워져 있지 않은 곳은 x로, 채워져 있는 곳은 'A'부터 'L'까지 알파벳으로 채워져 있다. i번째 알파벳은 숫자 i를 의미한다. '.'는 매직 스타의 형태를 만들기 위해서 사용하는 문자이다. 모든 입력은 예제 입력과 같은 형태로 주어진다.

 

 

 

출력 :

매직 스타를 만들 수 있는 방법 중에 사전 순으로 가장 앞서는 방법을 출력한다. (모든 줄을 순서대로 붙여서 하나의 문자열로 만든 뒤, 사전 순으로 비교한다.) 항상 정답이 존재하는 경우만 입력으로 주어진다.

 

 

 

 

 

 

풀이)

 

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// 3967. 매직스타
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
// 매직스타 배열
vector<vector<int>> pattern = {
    { 0257 },
    { 123 ,4 },
    { 78910 },
    { 03610 },
    { 15811 },
    { 46911 },
};
 
vector<int> vec(12);
 
// 해당 숫자를 썼는지 확인
vector<bool> visited(15false);
 
// 이미 숫자가 지정되어있는 경우
vector<bool> origin(12false);
 
bool fin = false;
 
void recur(int cur)
{
    if (fin == truereturn;
 
    if (cur == 12)
    {
        // 매직스타가 맞는지 확인
        for (int i = 0; i < pattern.size(); i++)
        {
            int temp = 0;
            for (int j = 0; j < pattern[i].size(); j++)
            {
                temp += vec[pattern[i][j]];
            }
 
            if (temp != 26return;
        }
        
        // 매직스타를 찾았다면, 필요없는 연산을 막기 위해 fin을 true로 바꾼다.
        fin = true;
 
        // 원하는 배열을 찾았다면 출력형식에 맞춰 출력해준다.
        for (int i = 0; i < 12; i++)
        {
            if (i == 0 || i == 11)
            {
                cout << "...." << char(vec[i] + 'A' - 1<< "....\n";
            }
            else if ((1 <= i && i <= 4|| (7 <= i && i <= 10))
            {
                cout << "." << char(vec[i] + 'A' - 1);
                if (i == 4 || i == 10cout << ".\n";
            }
            else if (5 <= i && i <= 6)
            {
                cout << ".." << char(vec[i] + 'A' - 1<< ".";
                if (i == 6cout << ".\n";
            }
        }
        
        return;
    }
 
    // 처음부터 숫자가 지정되어있는 경우
    // 다음 재귀로 바로 넘어간다.
    if (origin[cur] == true)
    {
        recur(cur + 1);
    }
    else
    {
        for (int i = 1; i < 13; i++)
        {
            if (visited[i] == truecontinue;
            visited[i] = true;
            vec[cur] = i;
            recur(cur + 1);
            visited[i] = false;
        }
    }
 
}
 
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    string temp = "";
    int idx = 0;
    for (int i = 0; i < 5; i++)
    {
        cin >> temp;
        for (int j = 0; j < temp.length(); j++)
        {
            if (temp[j] == 'x')
            {
                idx++;
            }
            else if (temp[j] != '.')
            {
                vec[idx] = temp[j] - 'A' + 1;
                visited[temp[j] - 'A' + 1= true;
                origin[idx] = true;
                idx++;
            }
        }
    }
 
    recur(0);
 
    return 0;
}
 
 
cs

출처 : https://www.acmicpc.net/problem/3967 

 

3967번: 매직 스타

매직 스타의 모양이 주어진다. 수가 채워져 있지 않은 곳은 x로, 채워져 있는 곳은 'A'부터 'L'까지 알파벳으로 채워져 있다. i번째 알파벳은 숫자 i를 의미한다. '.'는 매직 스타의 형태를 만들기

www.acmicpc.net