문제 출처: https://www.acmicpc.net/problem/21360
1. 코드
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
int N;
cin >> N;
string arr;
cin >> arr;
int min = N;
int first;
int last;
for (int i = 0; i < arr.length(); i++)
{
if (arr[i] == '.') {
first = i;
break;
}
}
for (int i = first + 1; i < arr.length(); i++)
{
if (arr[i] == '.') {
last = i;
if (min > last - first - 1)
min = last - first - 1;
first = last;
}
}
cout << min;
}
2. 풀이
이 문제는 문자열 처리에 대해 잘 알고있다면 쉽게 해결할 수 있다. 문자열을 입력받고 첫번째 공석의 위치를 탐색한 이후에 두 번째 공석의 위치를 찾아낸 뒤 두 거리를 빼고 최솟값으로 설정한 다음 두 번째 공석의 위치를 first에 저장하고 last에는 다음 공석의 위치를 찾아 반복을 해주면 문제는 쉽게 해결됩니다.
int min = N; //거리 최솟값
int first; //왼쪽에 있는 공석 위치
int last; //오른쪽에 있는 공석 위치
for (int i = 0; i < arr.length(); i++) //첫 번째 공석 위치 찾기
{
if (arr[i] == '.') {
first = i;
break;
}
}
반복문을 이용하여 첫 번째 공석의 위치를 탐색합니다.
for (int i = first + 1; i < arr.length(); i++)
{
if (arr[i] == '.') { //오른쪽에 있는 공석 위치 찾기
last = i;
if (min > last - first - 1) //거리의 차이가 최솟값보다 더 작다면 저장
min = last - first - 1;
first = last; //오른쪽에 있는 공석의 위치를 왼쪽에 있는 공석의 위치로 지정
}
}
두 번째 공석 이후에도 반복문을 이용하는데 두 거리를 계산하고 최솟값보다 작다면 최솟값으로 설정하고 last의 값을 first에 저장한 뒤 계속해서 last의 값을 찾습니다.
3. 느낀점
해당 문제가 어떠한 언어로 쓰여있는지는 잘 모르지만 구글 번역기로 문제를 알아볼 수 있어서 쉽게 문제를 해결했습니다.
'컴퓨터 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 10926번: ??! [Java] (0) | 2022.10.02 |
---|---|
백준 알고리즘 2231번: 분해합 C언어 (0) | 2021.08.09 |
백준 알고리즘 16466번: 콘서트 [C++] (0) | 2021.06.27 |
백준 알고리즘 2740번: 행렬 곱셈 [C++] (0) | 2021.05.26 |
백준 알고리즘 5430번: AC [C++] (0) | 2021.05.20 |