알고리즘 분류에 '투 포인터' 라고 나와있어 인터넷을 찾아 봤다.
간단하게 설명하면 부분 배열의 시작과 끝을 나타내는 두 점을 이용해서
원하는 값을 얻는 알고리즘이다.
참고: https://blog.naver.com/kks227/220795165570
투 포인터의 개념을 이용해서 풀었다.
#include <iostream>
#define MAX 1000001
using namespace std;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
int n;
cin >> n;
char* s = new char[n];
for (int i = 0; i < n; ++i) cin >> s[i];
int answer = MAX;
int start, end;
for (start = 0; start < n; ++start)
if (s[start] == '.') break;
for (end = start + 1; end < n; ++end)
if (s[end] == '.') break;
do {
int distance = end - start - 1;
if (distance < answer) answer = distance;
start = end;
for (end += 1; end < n; ++end)
if (s[end] == '.') break;
} while (end + 1 < n);
cout << answer << '\n';
return 0;
}
알고리즘 스터디에서 풀 쉬운 투 포인터 문제를 찾다 보니 스페인어로 된 문제를 풀게 됐다.
물론 구글 번역기의 도움을 받았고, 언어 때문인지 작성일 기준 맞춘 사람이 12명 뿐이다.
정답을 맞춘 뒤 채점 현황에서 맞춘 사람들을 확인하니 고스펙 분들 밖에 없어서 배우고자 하는 마음으로 소스를 봤다. 그리고 새로 알게 된 사실이 있다.
2번에 대해서만 설명을 덧붙이자면
std::cin 은 istream 의 객체로 표준 입력 스트림
cin.tie(0) 호출 시 cout 과 cin 를 untie 후 ostream* 반환
ostream 은 ios 에 상속되고 ios 는 ios_base 에 상속됨
ios_base 의 멤버 함수 sync_with_stdio 를 멤버 연산자로 호출할 수 있음