※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 3005번 문제인 크로스워드 퍼즐 쳐다보기이다.
문제는 아래 링크를 확인하자.
3005번: 크로스워드 퍼즐 쳐다보기
첫째 줄에 R과 C (2 ≤ R, C ≤ 20)가 주어진다. R는 행의 개수, C는 열의 개수이다. 그 다음 R개의 줄엔 C개의 문자가 포함되어 있다. 각 문자는 영어 알파벳 소문자 또는 '#'이며, '#'인 경우에는 막혀
www.acmicpc.net
이 문제에서는 주어진 크로스워드 퍼즐에서 가로 또는 세로방향으로 읽을 수 있는 단어 중 사전순으로 가장 빨리 오는 것을 찾아야한다. 상식적으로 크로스워드 퍼즐의 각 단어는 중간서부터 읽어서 새로운 단어를 생각하지는 않는다는 점을 유의하자. 예를 들어, rainbow라는 문자열이 크로스워드 퍼즐에 있다 하더라도, rain이나 bow와 같은 부분문자열이 있다고 고려하지 않는다.
따라서, 각 행과 열을 한번씩 읽어나가면서 '#'이 나올 때까지 문자를 하나하나 저장하다가 '#을 만나거나 각 행 또는 열이 끝나면 저장된 문자열을 확인하는 식으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
string board[20];
int main()
{
int R, C; cin >> R >> C;
for (int i = 0;i < R;i++) cin >> board[i];
string ans = "zzzzzzzzzzzzzzzzzzzz";
for (int i = 0;i < R;i++) {
string s = "";
for (int j = 0;j < C;j++) {
if (board[i][j] == '#') {
if (s.length() >= 2 && ans > s) ans = s;
s = "";
}
else s += board[i][j];
}
if (s.length() >= 2 && ans > s) ans = s;
}
for (int j = 0;j < C;j++) {
string s = "";
for (int i = 0;i < R;i++) {
if (board[i][j] == '#') {
if (s.length() >= 2 && ans > s) ans = s;
s = "";
}
else s += board[i][j];
}
if (s.length() >= 2 && ans > s) ans = s;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17481 // C++] 최애 정하기 (0) | 2021.04.18 |
---|---|
[BOJ 3049 // C++] 다각형의 대각선 (0) | 2021.04.17 |
[BOJ 3010 // C++] 페그 (0) | 2021.04.15 |
[BOJ 9345 // C++] 디지털 비디오 디스크(DVDs) (0) | 2021.04.14 |
[BOJ 1517 // C++] 버블 소트 (0) | 2021.04.13 |