GitHubSeob

C++ / 백준 / 10942 / 팰린드롬? 본문

Baekjoon/Gold

C++ / 백준 / 10942 / 팰린드롬?

GitHubSeob 2024. 6. 5.
문제

 

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

 

 

문제풀이

 

팰린드롬이란 역순으로 읽어도 같은 말이 되는 말을 의미한다.

앞 뒤를 바꿔서 기존과 같은 수열이면 YES를 출력하면 되는 문제이다.

 

팰린드롬이 되는 시작 인덱스와 끝 인덱스를 2차원 벡터로 표현하였다.

ex) 1부터 3자리까지 팰린드롬이면 vector[1][3]=true, 거짓이면 vector[1][3]=false

 

시작 인덱스가 팰린드롬의 중간 인덱스로 두고 문제를 풀었다.

그리고 팰린드롬 수의 길이를 홀수, 짝수의 경우로 나눴다.

홀수인 경우, 시작 지점 앞뒤로 수가 있고 앞뒤 숫자가 같으면 vector[start-idx][start+idx]=true가 된다.

idx는 1부터 팰린드롬 수의 끝까지 증가한다, 중간에 팰린드롬 수가 아니면 다음 시작 인덱스로 넘어간다.

 

짝수인 경우, 먼저 시작 인덱스의 수와 바로 옆 한 칸(왼쪽 또는 오른쪽 방향 하나)과 같은지를 확인해야 한다.

같다면 두 수를 기준으로 양옆 한 칸씩 범위를 넓혀가며 숫자가 같은지를 확인하면 된다.

 

while문을 이용해 1부터 N까지의 범위를 넘어가는지, 양 끝 인덱스의 숫자가 같은지를 판별하였다.

 

코드
#include <iostream>
#include <vector>
using namespace std;

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

	int N(0), M(0);
	cin >> N;
	vector<int>seq(N + 1, 0);
	for (int idx = 1; idx <= N; ++idx)	cin >> seq[idx];
	cin >> M;

	vector<vector<bool>>isPalindrome(N + 1, vector<bool>(N + 1, false));

	for (int start = 1; start <= N; ++start) {
		int idx = 1;
		isPalindrome[start][start] = true;
		while (1 <= start - idx && start + idx <= N && seq[start - idx] == seq[start + idx]) {
			isPalindrome[start - idx][start + idx] = true;
			++idx;
		}
		if (start + 1 > N || seq[start] != seq[start + 1]) continue;
		isPalindrome[start][start + 1] = true;

		idx = 1;
		while (1 <= start - idx && start + idx + 1 <= N && seq[start - idx] == seq[start + idx + 1]) {
			isPalindrome[start - idx][start + idx + 1] = true;
			++idx;
		}
	}

	int start(0), end(0);
	for (int idx = 0; idx < M; ++idx) {
		cin >> start >> end;
		cout << isPalindrome[start][end] << '\n';
	}
}

 

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 1717 / 집합의 표현  (0) 2024.06.05
C++ / 백준 / 5052 / 전화번호 목록  (0) 2024.04.04
C++ / 백준 / 6156 / Cow Contest  (0) 2024.04.04
C++ / 백준 / 3020 / 개똥벌레  (0) 2024.03.28
C++ / 백준 / 1245 / 농장 관리  (0) 2023.10.15