작성일 :

문제 링크

27627번 - Splitology

설명

문자열을 두 개의 비어 있지 않은 부분으로 나눴을 때 둘 다 팰린드롬이면 해당 분할을 출력하는 문제입니다.


접근법

모든 분할 지점을 확인하며 앞부분과 뒷부분이 각각 팰린드롬인지 검사합니다.

하나라도 찾으면 그 두 문자열을 출력하고, 끝까지 없으면 NO를 출력합니다.


Code

C#

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
using System;

class Program {
  static bool IsPal(string s, int l, int r) {
    while (l < r) {
      if (s[l] != s[r]) return false;
      l++;
      r--;
    }
    return true;
  }

  static void Main() {
    var s = Console.ReadLine()!;
    var n = s.Length;

    for (var i = 1; i < n; i++) {
      if (IsPal(s, 0, i - 1) && IsPal(s, i, n - 1)) {
        Console.WriteLine($"{s.Substring(0, i)} {s.Substring(i)}");
        return;
      }
    }

    Console.WriteLine("NO");
  }
}

C++

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
#include <bits/stdc++.h>
using namespace std;

bool isPal(const string& s, int l, int r) {
  while (l < r) {
    if (s[l] != s[r]) return false;
    l++;
    r--;
  }
  return true;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  string s; cin >> s;
  int n = s.size();

  for (int i = 1; i < n; i++) {
    if (isPal(s, 0, i - 1) && isPal(s, i, n - 1)) {
      cout << s.substr(0, i) << " " << s.substr(i) << "\n";
      return 0;
    }
  }

  cout << "NO\n";

  return 0;
}