반응형
리뷰
https://www.acmicpc.net/problem/14713
문제가 잘 이해되지 않았는데 예상되는 케이스를 반례로 넣었더니 AC를 받았다.
알고리즘 분류에 큐가 적혀있는데 큐 없이도 문제가 해결 가능했다, 어쩌면 더 최적화 코드가 있을 지도?
전역 변수
- n : 앵무새의 개수
- idx : 각 앵무새가 읽은 단어의 인덱스를 저장하기 위한 정수형 배열
함수
없음
문제풀이
- key가 문자열, value가 pair<int, int>타입인 해시맵 dic을 초기화 해준다.
- n값을 입력 받고, 이후 문자열을 getline으로 받을 것이기 때문에 cin.get()를 수행해 준다.
- n번의 반복문을 실행하고, 정수형 변수 index를 0으로 초기화 해준다.
- 빈 문자열 변수 s를 초기화 하고 getline을 통해 cin값을 s에 저장해 준다.
- stringstream 타입의 변수 ss에 문자열 s를 대입해 준다.
- getline을 통해 ss에서 공백을 구분으로 문자열 s에 문자열을 파싱해 준다.
- 파싱된 값을 해시맵의 키로 설정하고 값을 현재 앵무새의 인덱스 i와, 단어의 인덱스 index를 후위 증가시켜 넣는다.
- 모든 앵무새의 단어를 받고 난 후 이제 받아쓴 단어와 비교를 해 줄 차례다.
- 빈 문자열 변수 s를 초기화 하고, getline을 통해 해당 문자열에 한줄을 입력 받는다.
- 동일하게 stringstream 타입의 변수 ss에 문자열 s를 대입해 준다.
- geline을 통해 ss에서 공백을 구분으로 문자열 s에 문자열을 파싱해 준다.
- 만약 dic의 s키가 없다면, 존재하지 않는 단어를 적은 것이므로 Impossible을 출력하고 탐색을 종료한다.
- dic의 s키가 존재한다면, pair<int, int> 타입의 변수 d에 해당 큐의 첫번 째 값을 뽑아준다.
- d의 second가 idx의 d.first와 같은지 비교해 준다. 아니라면 단어의 순서가 변경되 것이므로 Impossible
- 같다면 idx의 d.first(앵무새)의 값을 증가시켜 준 뒤 dic에서 s를 제거해 준다.
- 모든 탐색이 종료될 때 까지 Impossible이 출력되지 않았다면 한 가지 로직을 더 수행해 준다.
- dic의 size가 1이상 이라면 모든 앵무새의 말을 받아 적지 못한 것이므로 Impossible을 출력한다.
- dic의 size가 0이라면 모든 앵무새의 말을 받아 적은 것이기에 Possible을 출력한다.
참고 사항
- 앵무새가 말한 내용을 한 줄로 받아야 하기 때문에 stringstream과 getline을 사용해 주었다.
- 각 단어를 말한 앵무새와 몇번째로 말했는지를 저장하기 위해 dic의 값으로 pair<int, int> 를 사용했다.
- 앵무새 존재 여부는 앵무새를 1-based-index를 통해 0일 경우 없다고 판단하였다.
- idx 배열은 각 앵무새가 몇번째 단어를 말할 차례인지를 확인 하기 위한 배열이다.
정답 코드
#include<iostream>
#include<sstream>
#include<unordered_map>
#include<string>
#define pii pair<int, int>
using namespace std;
int n;
int idx[101];
string s;
unordered_map<string, pii> dic;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n; cin.get();
for (int i = 1; i <= n; ++i) {
int index = 0;
getline(cin, s);
stringstream ss(s);
while (getline(ss, s, ' ')) dic[s] = { i, index++ };
}
getline(cin, s);
stringstream ss(s);
while (getline(ss, s, ' ')) {
if (!dic[s].first || dic[s].second != idx[dic[s].first]) {
cout << "Impossible";
return 0;
}
else {
idx[dic[s].first]++;
dic.erase(s);
}
}
if (!dic.size()) cout << "Possible";
else cout << "Impossible";
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[P3] 백준 13544번 수열과 쿼리 3 C++ 세그먼트 트리, 머지소트 트리 (0) | 2024.11.27 |
---|---|
[S4] 백준 9372번 상근이의 여행 C++ BFS (0) | 2024.11.26 |
[G5] 백준 2504번 괄호의 값 C++ 스택 (1) | 2024.11.24 |
[G4] 백준 4803번 트리 C++ BFS, 트리, 싸이클 (0) | 2024.11.23 |
[G4] 백준 1339번 단어 수학 C++ 그리디 알고리즘, 우선순위 큐, 해시맵, 문자열 (0) | 2024.11.22 |