하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 1544 사이클 단어 C++

긤효중 2022. 7. 4. 11:59

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

 

1544번: 사이클 단어

사이클 단어는 어떤 단어를 원형 모양으로 차례대로 쓴 것이다. 따라서, 어떤 단어를 이렇게 쓴 후에 임의의 단어를 고른다. 그 후에 시계방향으로 차례대로 읽으면 그 것이 단어가 된다. 만약에

www.acmicpc.net


문제

사이클 단어는 어떤 단어를 원형 모양으로 차례대로 쓴 것이다. 따라서, 어떤 단어를 이렇게 쓴 후에 임의의 단어를 고른다. 그 후에 시계방향으로 차례대로 읽으면 그 것이 단어가 된다. 만약에 단어 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