티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 10988번 팰린드롬인지 확인하기
https://www.acmicpc.net/problem/10988

 

10988번: 팰린드롬인지 확인하기

첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.

www.acmicpc.net

* 사용언어 : C언어, C++

1. 문제

100자 이하인 단어를 앞으로 읽을 때와 거꾸로 읽을 때
같으면(팰린드롬) 1, 아니면 0 출력

2. 풀이

아래 3단계 절차로 풀이하였습니다.
 
1) 문자열을 %s 로 입력받기
2) 문자열의 길이 n 을 찾기
3) (0 과 n - 1), (1 과 n - 2), ... (n / 2 - 1, n / 2 + 1) 순차적으로 비교하기
 
1)번은 문자열의 입출력 관련 문제를 풀어오셨다면 쉽게 하실 수 있습니다.
 
2)번은 문자열 처리 관련 함수를 사용하면 됩니다.
대표적인 함수로 strcmr(비교), strlen(길이) 등이 있는데
저는 문자열의 길이를 찾는 strlen 을 직접 구현해봤습니다.
 
3)번은 ① 탐색 범위와 ② 결과값 처리 방식에 대해서 설명하겠습니다.
 
탐색 범위는 문자열의 절반, 즉 0 부터 n / 2 전 까지만 하는데
절반만 탐색하더라도 중앙값을 기준으로 대칭되는 값을 비교하면 전부 탐색하기 때문입니다.
i 가 0 일 때 [0] 번째 문자와 [n - 0 - 1] 번째 문자를 비교하고,
i 가 1 일 때 [1] 번째 문자와 [n - 1 - 1] 번째 문자를 비교하고,
...
[i] 번째 문자와 [n - i - 1] 번째 문자를 비교하면 전체 비교가 됩니다.
 
결과값(res) 는 탐색 전에 미리 1로 초기화합니다.
출력과 동일하게 res 가 1이면 팰린드롬이고 0이면 아닌 것으로 하였습니다.
 
탐색을 하다가 대칭되는 값이 다르면 0으로 바꾸고 break 를 하여 탐색을 멈추었습니다.
(더 이상 탐색하는게 의미가 없으므로)

그 외 설명은 아래 코드로 대체하겠습니다.

3. 코드

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
10988_팰린드롬인지 확인하기
1112kb	0ms
*/
#include <cstdio>

int strlen(char *s, int i = 0) {
	for (; s[i]; ++i);
	return i;
}

int main() {
#ifdef _WIN32
	freopen("input.txt", "r", stdin);
#endif // _WIN32
	char s[101];
	scanf("%s", &s);
	
	int n = strlen(s);

	int res = 1;
	for (int i = 0; i < n / 2; ++i) {
		if (s[i] != s[n - i - 1]) {
			res = 0;
			break;
		}
	}

	printf("%d\n", res);
	return 0;
}

* n 이 홀수인 경우 중간 문자는 볼 필요가 없으므로 홀수, 짝수 모두 n / 2 전 까지 탐색하면 됩니다.

728x90
반응형
댓글