https://www.acmicpc.net/problem/1544
문제
사이클 단어는 어떤 단어를 원형 모양으로 차례대로 쓴 것이다. 따라서, 어떤 단어를 이렇게 쓴 후에 임의의 단어를 고른다. 그 후에 시계방향으로 차례대로 읽으면 그 것이 단어가 된다. 만약에 단어 A와 단어 B가 있을 때, 단어 B를 원형으로 써서, 단어 A와 같이 읽을 수 있으면, 두 단어는 같은 단어이다. 따라서, picture와 turepic은 같은 단어다.
N개의 단어가 주어졌을 때, 서로 다른 단어가 총 몇 개인지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 주어진다. 둘째 줄부터 단어가 한 줄에 하나씩 주어진다. 단어는 영어 소문자로만 이루어져 있다. N은 50보다 작거나 같은 자연수이며, 단어의 길이는 최대 50이다.
어떤 단어를 시계방향으로 읽으면 그 것의 단어가 된다.
단어 A와 B가 있을 떄, 단어 B를 원형으로 써서 A와 같이 읽을 수 있으면 같은 단어이다.
5
picture
turepic
icturep
word
ordw
picture과 같은 단어는
icturep ( i부터 시계방향으로 읽는 경우) |
cturepi(c부터 시계방향으로 읽는 경우) |
turepic(t부터 시계방향으로 읽는 경우) |
urepict(u부터 시계방향으로 읽는 경우) |
repictur(r부터 시계방향으로 읽는 경우) |
epicture(e부터 시계방향으로 읽는 경우) |
picture(p부터 시계방향으로 읽는 경우) |
이 모든 단어가 같은 단어이다.
그래서 문자열이 주어진다면 문자열의 시작부터 끝까지의 문자를 시작으로 해서 사이클 단어를 만들고 map에 넣어주는 식으로 해결하였다.
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main(void){
int n;
cin >> n;
map<string,int> m;
map<string,int>::iterator iter;
int ans = 0; //서로 다른 단어가 몇 개인지
for(int i = 0;i<n;i++){
string str;
cin >> str;
iter = m.find(str);
//문자열을 입력받고 map에 없다면 서로 다른 단어 + map에 사이클 단어를 모두 넣어줌
if(iter == m.end()){ //map에 없는 경우
ans++;
/*사이클 단어를 만드는 코드*/
for(int j = 0;j<str.size();j++){
string temp = "";
for(int k = j;k<str.size();k++){
temp = temp + str[k];
}
for(int q = 0;q<j;q++){
temp = temp + str[q];
}
m.insert({temp,i});
}
}
else{
continue;
}
}
cout << ans;
}
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main(void){
int n;
cin >> n;
map<string,int> m;
map<string,int>::iterator iter;
int ans = 0; //서로 다른 단어가 몇 개인지
for(int i = 0;i<n;i++){
string str;
cin >> str;
iter = m.find(str);
//문자열을 입력받고 map에 없다면 서로 다른 단어 + map에 사이클 단어를 모두 넣어줌
if(iter == m.end()){ //map에 없는 경우
ans++;
/*사이클 단어를 만드는 코드*/
for(int j = 0;j<str.size();j++){
string temp = "";
for(int k = j;k<str.size();k++){
temp = temp + str[k];
}
for(int q = 0;q<j;q++){
temp = temp + str[q];
}
m.insert({temp,i});
}
}
else{
continue;
}
}
cout << ans;
}
'알고리즘' 카테고리의 다른 글
백준 10971 외판원 순회 2 C++ (0) | 2022.07.06 |
---|---|
너비 우선 탐색 (BFS, Breadth-First Search) (0) | 2022.07.05 |
백준 9742 순열 C++ (0) | 2022.06.28 |
백준 1520 C++ (0) | 2022.06.27 |
백준 18353 C++ (0) | 2022.06.27 |