[C++][백준 15501] 부당한 퍼즐

PublicMinsu·2025년 9월 9일

문제

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

접근 방법

동일한 수열이기 위해서는 동일한 순서로 존재해야 합니다. 만약 동일한 순서가 아니라면 뒤집혔을 수도 있다는 것이므로 뒤집은 뒤에 동일한 순서이면 됩니다.

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n;
vector<int> seq1, seq2;

void initSeq(vector<int> &seq)
{
    seq = vector<int>(n);

    for (int &i : seq)
    {
        cin >> i;
    }
}

bool isGoodPuzzle()
{
    int index = 0;

    while (true)
    {
        if (seq1[0] == seq2[index])
        {
            break;
        }

        ++index;
    }

    if (seq1[1] == seq2[(index + 1) % n])
    {
        for (int i = 2; i < n; ++i)
        {
            if (seq1[i] != seq2[(index + i) % n])
            {
                return false;
            }
        }

        return true;
    }
    else if (seq1[n - 1] == seq2[(index + 1) % n])
    {
        for (int i = 2; i < n; ++i)
        {
            if (seq1[n - i] != seq2[(index + i) % n])
            {
                return false;
            }
        }

        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0);

    cin >> n;

    initSeq(seq1);
    initSeq(seq2);

    cout << (isGoodPuzzle() ? "good puzzle" : "bad puzzle");
    return 0;
}

풀이

동일한 수를 사용하는 인덱스를 찾고 해당 인덱스를 기준으로 주변 수를 확인하여 방향을 확인한 뒤 동일한 순서로 수가 존재하는지 확인해 주면 됩니다.

profile
연락 : publicminsu@naver.com

0개의 댓글