출처
https://softeer.ai/practice/7703
문제
퍼즐을 좋아하는 하이비는 작년에 이어 올해에도 퍼즐과 관련된 문제를 내기로 했다.
이번에는 Indirect Indexing으로, 다음과 같은 방식을 따른다.
1. N개의 문자열 쌍 (S1,T1), (S2,T2),…, (SN,TN)이 주어진다. 각 쌍에 대해, Si의 길이와 Ti의 길이는 같다.
2. Si에서 글자 x 또는 X가 등장하는 위치를 Pi라고 하자. 이 위치는 항상 유일하다.
3. 이때, Ti의 Pi번째 글자를 읽으면 된다. 단, 소문자는 대문자로 바꿔야 한다.
4. 예를 들어, Si가 Indexing이고 Ti가 Indirect라면 읽게 되는 글자는 R이 된다.
제약조건
1 ≤ N ≤ 500,000
입력되는 문자열의 길이 합은 1,000,000을 넘지 않으며, 모든 문자열은 영어 알파벳 대소문자 또는 숫자로만 이루어져 있다.
입력
첫 번째 줄에 문자열 쌍의 개수 N이 주어진다.
두 번째 줄부터 N개의 줄에 걸쳐, i+1번째 줄에는 쌍을 이루는 두 문자열 Si,Ti가 공백으로 구분되어 주어진다.
출력
첫 번째 줄에 N개의 문자열 쌍에 대해 읽게 되는 글자를 차례대로 붙여서 출력한다.
풀이
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
vector<pair<string, string>> puzzle(N);
string result;
for (int i = 0; i < N; i++) {
cin >> puzzle[i].first >> puzzle[i].second;
}
for (int i = 0; i < N; i++) {
int len = puzzle[i].first.length();
for (int j = 0; j < len; j++) {
if ((puzzle[i].first[j] == 'x' || puzzle[i].first[j] == 'X')) {
result += toupper(puzzle[i].second[j]);
}
}
}
cout << result << "\n";
return 0;
}
cin과 cout을 빠르게 풀 수 있다고 하여 참고해서 풀어봤다. 참고
알고리즘(C++) / cin, cout 입출력 속도 높이기
백준 2751문제를 풀 때 입력과 출력은 맞게 나오는데 결과는 시간 초과라는 결과가 나왔다. 알아본 결과 cin과 cout을 사용할 때 시간이 상당히 걸린다는 것을 알았다. 그래서 cin과 cout의 입출력 속
se-jung-h.tistory.com
두줄이면 입출력 속도가 향상된다!
ios::sync_with_stdio(false);
cin.tie(NULL);
ios::sync_with_stdio(false)의 의미❓
C++의 iostream과 C의 stdio의 버퍼링 동기화를 비활성화한다. C++은 기본적으로 C의 stdio와의 호환을 위해 버퍼를 공유하고 동기화한다.(동시에 쓸 수 있다는 뜻) 근데 이걸 공유해버리면 성능이 저하된다. 따라서 동기화를 해제시켜주면 성능이 올라간다. 동기화를 해제하는 것이기 때문에 printf, scanf를 혼용해서 사용하면 안된다!!
멀티스레드 환경에서 iostream과 stdio 라이브러리를 혼용해서 사용하게 된다면 끔찍할 것 같다😭 맞왜틀...맞왜틀...을 외치겠지...
cin.tie(NULL)의 의미❓
cin이 cout에 묶여 있는 것을 해제한다. cin은 cout과 자동으로 연결되어, cin을 사용할 때마다 cout을 자동으로 flush(버퍼를 비우는 활동)한다. 그 과정이 오래 걸리기 때문에, 이를 생략하면 입출력 속도가 빨라지는 것이다! 순서를 정해주는 거라고 생각하면 될 것 같다. 멀티스레드 환경에서 cout -> cin의 순서가 뒤바뀌다보면 잘못된 입력을 넣을 가능성이 커질 거니까!
결론적으로, 만약 프로그램을 다뤄야 하는 환경이라면 이 명령어는 권장하지 않는다.
그러나 이건 코테니까~ 왜 cin과 cout이 더 느렸는지, C와의 호환을 위해 명령어의 옵션을 어떻게 구현하였는지를 알아보는 데 의의가 있는 문제라고 생각한다.
'알고리즘 > Softeer' 카테고리의 다른 글
[C++] Softeer Lv.3 나무 섭지 (0) | 2024.10.31 |
---|---|
[C++] Softeer Lv.2 GBC (0) | 2024.10.30 |
[C++] Softeer Lv.3 [HSAT 6회 정기 코딩 인증평가 기출] 출퇴근길 (0) | 2024.10.30 |
[C++] Softeer Lv.3 강의실 배정 (0) | 2024.10.29 |
[C++] Softeer Lv.3 징검다리 (0) | 2024.10.25 |