SWExpertAcademy의 회문1(1215 / D3) 문제이다.


[ 문제풀이 ]

1) 사실 이 문제의 풀이랄 것도 없이 모든 경우를 다 해보았다.

   맵에 존재하는 모든 좌표점에서 문제의 조건에 맞는지를 판단해 보았다.

   문제의 조건이라는 것은 다음과 같이 2가지로 나누어서 생각했다.

   1. 현재 좌표에서 가로로 제시된 길이의 회문을 가지는지

   2. 현재 좌표에서 세로로 제시된 길이의 회문을 가지는지

 

2) 현재 좌표에서 가로든, 세로든 회문인지 아닌지를 판단하는 방법으로는 직접 카운트 해보는 방법을 사용하였다.

   예를 들어서 현재 좌표에 'A' 라는 문자가 있고, 제시된 길이가 5라고 가정해보겠다.

   그리고 맵은 A B C B A ~ ~ 이런식으로 존재한다고 가정해보겠다.

   그렇다면 먼저 시작점과 끝점을 찾는다.

   시작점의 문자는 'A', 끝점의 문자는 'A'(가장 마지막에 있는 'A')가 될 것이다.

   그리고 시작점의 문자와 끝점의 문자가 같다면 시작점++, 마지막점-- 를 시켜준다.

   그렇게 되면 시작점의 문자는 'B', 끝점의 문자도 'B'가 될것이다.

   이와 같이 반복하다가 시작좌표 > 끝좌표 가 되는 순간, 비교를 종료해주면 된다.

   중간에 다를 경우에는 그 즉시 비교를 종료해주면 된다.

   예를 들어서 A B C D A 가 있을 경우

   시작점 = A, 끝점 = A 라서 시작점++, 끝점--를 해줄 경우,

   시작점 = B, 끝점 = D가 된다. 즉 서로 다르기 떄문에 회문이 아니라는 것이고 이 즉시 비교를 종료해주면 된다.


[ 소스코드 ]

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
124
#include<iostream>
#include<cstring>
 
#define endl "\n"
#define MAX 8
using namespace std;
 
int Len, Answer;
char MAP[MAX][MAX];
 
void Initialize()
{
    Answer = 0;
    Len = 0;
    memset(MAP, 0sizeof(MAP));
}
 
void Input()
{
    cin >> Len;
    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            cin >> MAP[i][j];
        }
    }
}
 
void Check_Garo(int x, int y)
{
    int sx = x;
    int sy = y;
    int ex = x;
    int ey = y + Len - 1;
    bool Flag = false;
 
    while (1)
    {
        if (sy > ey)
        {
            Flag = true;
            break;
        }
 
        if (MAP[sx][sy] == MAP[ex][ey])
        {
            sy++;
            ey--;
        }
        else
        {
            break;
        }
    }
    if (Flag == true) Answer++;
}
 
void Check_Sero(int x, int y)
{
    int sx = x;
    int sy = y;
    int ex = x + Len - 1;
    int ey = y;
    bool Flag = false;
 
    while (1)
    {
        if (sx > ex)
        {
            Flag = true;
            break;
        }
 
        if (MAP[sx][sy] == MAP[ex][ey])
        {
            sx++;
            ex--;
        }
        else
        {
            break;
        }
    }
    
    if (Flag == true) Answer++;
}
 
void Solution()
{
    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            if(j + Len <= MAX) Check_Garo(i, j);
            if(i + Len <= MAX) Check_Sero(i, j);
        }
    }
}
 
void Solve()
{
    int Tc = 10;
    for (int T = 1; T <= Tc; T++)
    {
        Initialize();
        Input();
        Solution();
        
        cout << "#" << T << " " << Answer << endl;
    }
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
cs


+ Recent posts