[백준 10942][C++] 팰린드롬?

2023. 8. 11. 20:22·코딩 공부/백준(C++)

문제 링크

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


 

◆문제 해결 및 설명◆

문제 : 수열을 주고, 어디 부터 어디까지가 펠린드롬 이냐 묻는 질문에 대답하는 문제

 

펠린드롬이란 거꾸로 읽어도 똑같은 문장이나 단어를 뜻한다. 

따라서 직접 뒤집어서 비교하거나, 포인터를 통해서 문자가 같은지 판별해주면 되는데 이 문제는 수열의 크기 최대 2,000, 질문의 개수 최대 1,000,000 이며 시간 제한이 0.5초 이다.

위에서 이야기한 두 방법으로는 풀 수 가 없다.

 

다이나믹 프로그래밍으로 풀 수 있는데

기준을 잡고 기준이 펠린드롬일 때, 좌우로 하나씩 증가 했을 때 좌우가 같은 문자열이라면 그 문자는 펠린드롬이다.

abcba에서 c가 기준인것이 보일 것이다. 좌우로 하나 늘린 bcb도 펠린드롬, abcba도 펠린드롬이다.abcda의 경우 c는 펠린드롬 bcd는 펠린드롬이 아니고, 이후에 증가하는 모든 경우에도 펠린드롬이 아니다.(c가 기준일 때)이를 활용하여 문제를 풀 수 있다.

 

나의 경우에는 행을 시작위치, 열을 끝나는 위치로 하는 이차원 배열 선언하였고, 펠린드롬 일때 1로 배열에 저장하였다.전의 값이 펠린드롬인지 확인하기 위해서 이차원배열[i + 1][k - 1] 값이 양수인지 검사하고 행과열의 문자열이 같은지 확인하였다.

 

◆코드 전문◆

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);
    int N_size, Q_size, answer;

    cin >> N_size;
    vector<int> array(N_size);
    for (int i = 0; i < array.size(); i++)
    {
        int buf;
        cin >> buf;
        array[i] = buf;
    }

    cin >> Q_size;
    vector<pair<int, int>> questions(Q_size);
    for (int i = 0; i < questions.size(); i++)
    {
        int startBuf, endBuf;
        cin >> startBuf >> endBuf;
        questions[i] = make_pair(startBuf, endBuf);
    }

    vector<vector<int>> matirxArray(N_size, vector<int>(N_size));
    for (int i = matirxArray.size() - 1; i >= 0; i--)
    {
        for (int k = i; k < matirxArray[i].size(); k++)
        {
            if (array[i] == array[k])
            {
                matirxArray[i][k] = 1;
                if (i + 1 >= matirxArray.size() || k - 1 < 0)
                {
                    continue;
                }
                if (k - 1 < i + 1)
                {
                    continue;
                }
                if (matirxArray[i + 1][k - 1] <= 0)
                {
                    matirxArray[i][k] = 0;
                }
            }
        }
    }

    for (int i = 0; i < questions.size(); i++)
    {
        cout << matirxArray[questions[i].first - 1][questions[i].second - 1] << "\n";
    }
}

'코딩 공부 > 백준(C++)' 카테고리의 다른 글

[백준 17252][C++] 삼삼한 수 (3가지 방법)  (0) 2023.09.03
[백준 1461][C++] 도서관  (0) 2023.08.23
[백준 1911][C++] 흙길 보수하기  (0) 2023.08.11
[백준 2607][C++] 비슷한 단어  (0) 2023.08.11
[백준 15686][C++] 치킨 배달  (0) 2023.08.09
'코딩 공부/백준(C++)' 카테고리의 다른 글
  • [백준 17252][C++] 삼삼한 수 (3가지 방법)
  • [백준 1461][C++] 도서관
  • [백준 1911][C++] 흙길 보수하기
  • [백준 2607][C++] 비슷한 단어
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
        • 일기
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
        • 책
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

    ~
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[백준 10942][C++] 팰린드롬?
상단으로

티스토리툴바