๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 17609 : ํšŒ๋ฌธ (ํˆฌํฌ์ธํ„ฐ) / ํ…Œ์ŠคํŠธ์ผ€์ด์Šค / ์‚ฝ์งˆ ๊ธฐ๋ก

 

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

๋ฌธ์ œ

ํšŒ๋ฌธ(ๅ›žๆ–‡) ๋˜๋Š” ํŒฐ๋ฆฐ๋“œ๋กฌ(palindrome)์€ ์•ž ๋’ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ณผ ๋•Œ ๊ฐ™์€ ์ˆœ์„œ์˜ ๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ‘abba’ ‘kayak’, ‘reviver’, ‘madam’์€ ๋ชจ๋‘ ํšŒ๋ฌธ์ด๋‹ค. ๋งŒ์ผ ๊ทธ ์ž์ฒด๋Š” ํšŒ๋ฌธ์ด ์•„๋‹ˆ์ง€๋งŒ ํ•œ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜์—ฌ ํšŒ๋ฌธ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ๋ฌธ์ž์—ด์„ “์œ ์‚ฌํšŒ๋ฌธ”(pseudo palindrome)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ‘summuus’๋Š” 5๋ฒˆ์งธ๋‚˜ ํ˜น์€ 6๋ฒˆ์งธ ๋ฌธ์ž ‘u’๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ‘summus’์ธ ํšŒ๋ฌธ์ด ๋˜๋ฏ€๋กœ ์œ ์‚ฌํšŒ๋ฌธ์ด๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์€ ์ œ์‹œ๋œ ๋ฌธ์ž์—ด์„ ๋ถ„์„ํ•˜์—ฌ ๊ทธ๊ฒƒ์ด ๊ทธ ์ž์ฒด๋กœ ํšŒ๋ฌธ์ธ์ง€, ๋˜๋Š” ํ•œ ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•˜๋ฉด ํšŒ๋ฌธ์ด ๋˜๋Š” “์œ ์‚ฌํšŒ๋ฌธ”์ธ์ง€, ์•„๋‹ˆ๋ฉด ํšŒ๋ฌธ์ด๋‚˜ ์œ ์‚ฌํšŒ๋ฌธ๋„ ์•„๋‹Œ ์ผ๋ฐ˜ ๋ฌธ์ž์—ด์ธ์ง€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์ผ ๋ฌธ์ž์—ด ๊ทธ ์ž์ฒด๋กœ ํšŒ๋ฌธ์ด๋ฉด 0, ์œ ์‚ฌํšŒ๋ฌธ์ด๋ฉด 1, ๊ทธ ์™ธ๋Š” 2๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. 

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T(1 ≤ T ≤ 30)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ T๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 3 ์ด์ƒ 100,000 ์ดํ•˜์ด๊ณ , ์˜๋ฌธ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ถœ๋ ฅ

๊ฐ ๋ฌธ์ž์—ด์ด ํšŒ๋ฌธ์ธ์ง€, ์œ ์‚ฌ ํšŒ๋ฌธ์ธ์ง€, ๋‘˜ ๋ชจ๋‘ ํ•ด๋‹น๋˜์ง€ ์•Š๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ํšŒ๋ฌธ์ด๋ฉด 0, ์œ ์‚ฌ ํšŒ๋ฌธ์ด๋ฉด 1, ๋‘˜ ๋ชจ๋‘ ์•„๋‹ˆ๋ฉด 2๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.


 

๋ฐฑ์ค€ ๊ณจ๋“œ5.

์ฒ˜์Œ์— ๋ฌธ์ œ ๋ณด๊ณ  ํˆฌํฌ์ธํ„ฐ๋„ค~ํ•˜๊ณ  ์˜๊ธฐ์–‘์–‘ํ•˜๊ฒŒ ์ œ์ถœํ–ˆ๋Š”๋ฐ ๋ฐ”๋กœ ํ‹€๋ ค๋ฒ„๋ฆผ ใ…‹.ใ…‹

๋ญ๊ฐ€ ๋ฌธ์ œ์ธ๊ฐ€ ํ–ˆ๋Š”๋ฐ

๋‹ค์Œ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๋Œ๋ ค๋ดค๋”๋‹ˆ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 2
abbab
babba

 

๊ธฐ์กด์˜ ๋‚ด ์ฝ”๋“œ๋Š” ์ขŒ์šฐ์—์„œ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ ๋ฐœ๊ฒฌํ•  ์‹œ,

 

if(st[left+1]==st[right]) left++;
else if(st[left]==st[right-1]) right--;

 

์œ„์™€ ๊ฐ™์ด left+1์ด right ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋Š”๋ฐ,

๋ฌธ์ œ๋Š” abbab์™€ ๊ฐ™์ด ๋งจ ๋’ค์˜ ํ•œ ๊ธ€์ž๋งŒ ๋นผ๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ๋˜๋Š” ๊ฒฝ์šฐ์— ์–˜๋ฅผ ์œ ์‚ฌํšŒ๋ฌธ์œผ๋กœ ์ธ์‹์„ ๋ชปํ•˜๋Š” ๊ฑฐ์˜€๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ฑ ํ•จ์ˆ˜๋กœ ๋”ฐ๋กœ ๋บ€ ๋‹ค์Œ cnt ์ธ์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์„œ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์ตœ์†Ÿ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค!

์žฌ๊ท€๋กœ ํ•˜๋ฉด ๋” ํšจ์œจ์ ์ผ ๊ฒƒ ๊ฐ™๊ธดํ•œ๋ฐ.. ์–ด๋ ค์›Œ์„œ ๊ทธ๊ฑด ๋‹ค์Œ์— ^-^

 

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
#include <string>
using namespace std;

int findPalin(string st, int cnt){
    int left = 0;
    int right = st.length()-1;
    int diff = 0;
    while(left<=right){
        if (st[left] == st[right]){
            left++;
            right--;
        }
        else{
            diff++;
            if(cnt == 1){
                if(st[left+1]==st[right]) left++;
                else{
                    diff++;
                    break;
                }
            }
            if(cnt==2){
                if(st[left]==st[right-1]) right--;
                else{
                    diff++;
                    break;
                }
            }
        }
    }
    return diff;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    string st = "";
    cin >> t;

    for (int i = 0; i < t; ++i){
        cin >> st;
        int first = findPalin(st, 1);
        int second = findPalin(st, 2);
        int diff = min(first, second);

        if(diff==0) cout << 0;
        else if(diff==1) cout << 1;
        else cout << 2;
        cout << "\n";
    }
}