백준 21360 Biosalong

Jun·2021년 6월 30일
0

접근

알고리즘 분류에 '투 포인터' 라고 나와있어 인터넷을 찾아 봤다.
간단하게 설명하면 부분 배열의 시작과 끝을 나타내는 두 점을 이용해서
원하는 값을 얻는 알고리즘이다.
참고: https://blog.naver.com/kks227/220795165570

투 포인터의 개념을 이용해서 풀었다.

  1. 처음으로 시작하는 점의 위치를 찾아 start 에 삽입
  2. 두 번째로 시작하는 점의 위치를 end 에 삽입
  3. 두 점 사이의 거리의 최소값을 answer 에 삽입
  4. start 와 end 사이에는 점이 없으므로 start 를 end 의 위치로 jump
  5. 다음 점을 찾아 end 에 삽입
  6. 반복

구현

#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명 뿐이다.

정답을 맞춘 뒤 채점 현황에서 맞춘 사람들을 확인하니 고스펙 분들 밖에 없어서 배우고자 하는 마음으로 소스를 봤다. 그리고 새로 알게 된 사실이 있다.

  1. MAX 를 따로 전처리기로 처리하지 않고 1e9 와 같은 형식으로 초기화
  2. cin.tie(0)->sync_with_stdio(0);
  3. 반복문 하나로 정답(내 풀이와 원리 자체는 같음)

2번에 대해서만 설명을 덧붙이자면
std::cin 은 istream 의 객체로 표준 입력 스트림
cin.tie(0) 호출 시 cout 과 cin 를 untie 후 ostream* 반환
ostream 은 ios 에 상속되고 ios 는 ios_base 에 상속됨
ios_base 의 멤버 함수 sync_with_stdio 를 멤버 연산자로 호출할 수 있음

0개의 댓글