※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 3005번 문제인 크로스워드 퍼즐 쳐다보기이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/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

+ Recent posts