티스토리 뷰

반응형

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

 

17609번: 회문

각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.

www.acmicpc.net


⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 구현
  • 문자열
  • 그리디 알고리즘
  • 두 포인터

 


 

⊙ 문제 접근 과정

 

여러 체크포인트 변수를 생성하고 활용하여 회문인지 유사회문인지 그 외인지 검사했다.

 

회문일 경우 여러 체크포인트가 필요 없다.

유사회문 검사 경우에 복사본을 이용했는데 그때 여러 체크포인트가 필요했다.


 

⊙ 문제 풀이

 

#include <iostream>

using namespace std;

int T,indx,check;
string s1,s2;

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

    cin>> T;

    while(T--) {
        check=0; indx=0; //초기화
        cin >> s1; //값 입력받기
        s2=s1; //복사본 생성
        
        for(int i=0;i<s1.length()/2;i++) { // 검사
            if(s1[i] != s1[s1.length() -i -1]) {
                check=2; indx=i; // 대칭이 아니면 해당 인덱스를 저장하고 체크표시
                break;
            }
        }

        if(!check) cout << "0\n"; // 체크 표시가 안 되어 있다면 회문
        else {
            check=0; //초기화
            int check1=0,check2=0;
            int indx2=s1.length() -indx -1; // 해당 인덱스의 반대편 인덱스 위치 저장
            s1.erase(indx,1); s2.erase(indx2,1); // 대칭이 아닌 요소 지우기

            for(int i=0;i<s2.length()/2;i++) { // 검사
                if(s2[i] != s2[s2.length() -i -1])
                    check1=2;
                if(s1[i] != s1[s1.length() -i -1])
                    check2=2;
            }
            if(check1+check2==4) check=2;

            if(!check) cout << "1\n"; // 체크 표시가 안 되어 있다면 유사회문
            else cout << "2\n";  // 그 외
        }

        
    }
}

⊙ 결과

 


⊙ 마무리

 

 

NONE

 

좋아요는 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함