반응형

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

 

17609번: 회문

각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. 문자열을 입력받아 str 변수에 저장합니다.

 

2. s = 0, e = str.size() - 1에서 시작하여 s < e 일 때까지 투포인터를 활용하여 단어가 같다면 s++, e--, 단어가 다르다면 erase flag를 통해 지운 지 지우지 않았는지를 체크하고, s++일 때와 e--일 때를 총 두 번 구해줍니다.

 

3. 만약 erase == false, ans == true라면 0을, erase == true, ans == true라면 1을, 둘 다 아니라면 2를 출력합니다.

 

[ 소스코드 ]

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
#include<iostream>
#include<string>
 
using namespace std;
 
int T;
bool erase;
 
bool check(string str, int num)
{
    int s = 0, e = str.size() - 1;
 
    while (s < e) {
        if (str[s] == str[e]) {
            s++;
            e--;
        }
        else {
            if (!erase) {
                if (num == 1) {
                    if (str[s + 1== str[e]) {
                        s++;
                        erase = true;
                    }
                }
                else {
                    if (str[s] == str[e - 1]) {
                        e--;
                        erase = true;
                    }
                }
                if (!erase) {
                    return false;
                }
            }
            else {
                return false;
            }
        }
    }
    return true;
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> T;
 
    while (T--) {
        erase = false;
        string str;
        cin >> str;
 
        erase = false;
 
        if (check(str, 1)) {
            if (erase) {
                cout << 1;
            }
            else {
                cout << 0;
            }
            cout << '\n';
            continue;
        }
 
        erase = false;
 
        if (check(str, 2)) {
            if (erase) {
                cout << 1;
            }
            else {
                cout << 0;
            }
            cout << '\n';
            continue;
        }
 
        cout << 2;
        cout << '\n';
    }
}
cs
반응형

+ Recent posts