본문 바로가기

알고리즘/백준 문제풀기

콜라한캔 :: BOJ 백준 민균이의 비밀번호<문자열 처리>

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


< 민균이의 비밀번호 >


 민균이의 텍스트 파일에 들어 있는 문자열 중에 거꾸로 된 문자열도 함께 존재하는 경우 그것을 비밀번호라고 한다.


예를 들어 power가 비밀번호라면, rewop도 있다는 뜻이다. 중복된 답은 나오지 않는다고 했으므로 비밀번호 발견 시 바로


답을 출력해주면 된다.


이 문제의 경우 set을 이용했다.


n번 반복문을 돌면서 입력받은 문자열을 set에 추가해준 뒤 입력받은 문자열을 뒤집어서 set에 존재하는지를 체크해주었다.


set의 find 함수를 이용하였는데, find함수의 경우 set에서 찾고자 하는 문자열을 찾지 못했을 때 end()를 리턴한다.


따라서 set.find(문자열) != set.end() 일 때의 문자열을 찾아 답을 출력해주면 된다.



#include <iostream>
#include <string>
#include <algorithm>
#include <set>

using namespace std;

set<string> v;


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

	int n;
	cin >> n;

	string result;

	for (int i = 0; i < n; ++i)
	{
		string s;
		cin >> s;
		v.insert(s);

		for (int j = 0; j < s.size() / 2; ++j) {
			char temp = s[j];
			s[j] = s[s.size() - 1 - j];
			s[s.size() - 1 - j] = temp;
		}

		if (v.find(s) != v.end()) {
			result = s;
			break;
		}
	}
	cout << result.size() << " " << result[result.size() / 2];

	return 0;
}
< C로 푼 풀이 >


#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
char str[101][15];

int main()
{
	int n;
	scanf("%d", &n);
	
	int iSize = 0;
	int flag = 0;

	for (int i = 0; i < n; ++i)
	{
		char temp[15];
		scanf("%s", temp);
		strcpy(str[i], temp);

		int tSize = strlen(temp);

		for (int j = 0; j < tSize / 2; ++j)
		{
			char t = temp[j];
			temp[j] = temp[tSize - 1 - j];
			temp[tSize - 1 - j] = t;
		}

		for (int j = 0; j <= i; ++j)
		{
			if (!strcmp(temp, str[j])) {
				printf("%d %c\n", tSize, temp[tSize / 2]);
				flag = 1;
				break;
			}
		}
		if (flag) break;
	}

	return 0;
}