Baekjoon_algorithm_heuristic

백준 25630번 팰린드롬 소떡소떡

NeuroN 2023. 2. 2. 11:14

https://www.acmicpc.net/

 

Baekjoon Online Judge

Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.

www.acmicpc.net

문제 해석

더보기

소떡소떡은 s:소세지,t:떡으로 이루어짐.

팰린드롬이란 (순서대로 읽은 문자열 = 반대로 읽은 문자열)임.

유진이는 s를 t로 , 혹은 t를 s로 바꾸는 마법이 가능.

주어진 소떡소떡을 팰린드롬 소떡소떡으로 바꾸기 위해 마법을 최소 몇번 사용해야할까.

코드 해석

더보기

소떡소떡 길이 N, s와t로 이루어진 소떡소떡 K이 주어짐.

이때 팰린드롬의 특성을 고려하여, 문자열 K의 (첫번째 인덱스 = 마지막 인덱스) 임을 알 수 있다.

이런 방식으로 for반복문 이용,

for(int i = 0;i<N/2;i++)문자열 길이의 절반만큼 반복할때, 그래야 2개씩 비교할 수 있다.

if(K[i]!=k[N-i-1])인 경우, 굳이 s와 t를 바꿀 필요 없이 우리는 바꿔야 한다는 기록만 하면 되므로, 변수 count를 만들어 count+=1을 해준다.

이러면 바꿔줘야 할때마다 마법 사용 횟수가 1번씩 늘어난다고 기록하는 셈이다.

하지만 문자열이 1또는 2인 경우에는 주의해야한다.

문자열이 1이면 마법이 필요가 없으므로 0을 출력.

문자열이 2면 두 문자열만 비교하면 되므로 같으면 0출력, 다르면 1출력.

나머지 경우에는 count를 출력한다.

코드

#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N; cin >> N;
    string a; cin >> a;
    int count = 0;
    if (a.length() == 1)
    {
        cout << count;
        return 0;
    }
    else if (a.length() == 2)
    {
        if (a[0] == a[1])
        {
            cout << count;
            return 0;
        }
        else
        {
            cout << 1;
            return 0;
        }
    }

    for (int i = 0; i <= (a.length() / 2) -1; i++)
    {

        if (a[i] != a[a.length() - i-1])
        {
            count++;
        }
    }
    cout << count;

}