https://www.acmicpc.net/problem/1544
1544번: 사이클 단어
첫째 줄에 단어의 개수 N이 주어진다. 둘째 줄부터 단어가 한 줄에 하나씩 주어진다. 단어는 영어 소문자로만 이루어져 있다. N은 50보다 작거나 같은 자연수이며, 단어의 길이는 최대 50이다.
www.acmicpc.net
방문처리 여부로 풀었다. 원소들이 같은 단어이면 true, 다른 단어이면 false로 방문 여부를 표시한 뒤 현재 원소가 과거에 같은 원소였었던 경우는 탐색을 하지 않고 과거에 같은 적이 없던 단어면 현재 위치에서 탐색하여 총 몇 종류의 단어가 존재하는지 센 문제다.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool compare(string a, string b) {
return a.size() > b.size();
}
int main() {
int m;
int cnt = 0;
vector<string> v;
vector<bool> visit;
string s;
//단어들을 세팅
cin >> m;
for (int i = 0; i < m; i++) {
cin >> s;
v.push_back(s);
visit.push_back(false);
}
//같은 단어가 있는지 검사
for (int i = 0; i < v.size(); i++) {
//과거에 같은적이 있었던 단어이면 무시
if (visit[i]) {
continue;
}
string check = v[i]; //현재 단어를 미리 저장
visit[i] = true; //현재 단어를 방문 처리
//현재 찾을 단어를 시계 방향으로 회전
for (int j = 0; j < check.size(); j++) {
check = check + check[0]; //맨 앞을 뒤로 붙이고
check.erase(0, 1); //맨 앞을 뽑는다.
//현재 다음 원소부터 탐색
for (int k = i + 1; k < v.size(); k++) {
if (check == v[k]) { //같은 단어이면
visit[k] = true; //방문 처리
}
}
}
cnt++; //단어의 갯수 증가
}
cout << cnt;
}'백준' 카테고리의 다른 글
| 백준1669 - 멍멍이 쓰다듬기 (0) | 2019.12.29 |
|---|---|
| 백준1309 - 동물원 (0) | 2019.12.27 |
| 백준1965 - 상자넣기 (0) | 2019.12.26 |
| 백준2493 - 탑 (0) | 2019.12.24 |
| 백준9935 - 문자열 폭발 (0) | 2019.12.23 |