백준온라인저지

2804번 크로스워드 만들기

wonjjong 2019. 10. 3. 01:46

문제 출처 : https://www.acmicpc.net/problem/2804

 

 

2804번: 크로스워드 만들기

문제 창영이는 크로스워드 퍼즐을 만들려고 한다. 두 단어 A와 B가 주어진다. A는 가로로 놓여야 하고, B는 세로로 놓어야 한다. 또, 두 단어는 서로 교차해야 한다. (정확히 한 글자를 공유해야 한다) 공유하는 글자는 A와 B에 동시에 포함되어 있는 글자여야 하고, 그런 글자가 여럿인 경우 A에서 제일 먼저 등장하는 글자를 선택한다. 마찬가지로 이 글자가 B에서도 여러 번 등장하면 B에서 제일 처음 나오는 것을 선택한다. 예를 들어, A = "ABBA

www.acmicpc.net

 

 

풀이 과정

 

 A와 B 양쪽에 포함되는 문자를 찾아야 합니다. 두 단어를 앞에서부터 조사하면서 겹치는 문자가 있는지 간단히 찾을 수 있습니다. 

 

 B에서 겹치는 문자의 인덱스는 A가 출력될 행의 위치이고, A에서 겹치는 문자의 인덱스는 B가 출력될 열의 위치가 됩니다. 예제를 통해 알아보겠습니다.

 

 A = BANANA, B = PIDZAMA 라고 했을 때 'A'가 두 단어에 포함됩니다. A 문자열에서 'A'가 처음 시작되는 위치는 2 (BANANA) 이므로 B는 2열에 출력 되어야 합니다. B 문자열에서 'A'가 처음 시작되는 위치는 5 (PIDZAMA)이므로 A 문자열은 5 행에서 출력되어야 함을 의미합니다.

 

 

 

 

소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
int main()
{
    string a, b;
    cin >> a >> b;
    int horizontal = a.length();
    int vertical = b.length();
    int a_loc, b_loc;
    bool check = true;
    for (int i = 0; i < horizontal && check; i++)
    {
        for (int j = 0; j < vertical; j++)
        {
            if (a[i] == b[j])
            {
                a_loc = j;
                b_loc = i;
                check = false;
                break;
            }
        }
    }
 
    for (int i = 0; i < vertical; i++)
    {
 
        if (i == a_loc)
        {
            for (int j = 0; j < horizontal; j++)
            {
                cout << a[j];
            }
        }
        else
        {
            for (int j = 0; j < horizontal; j++)
            {
                if(j== b_loc) cout << b[i];
                else cout<<".";
            }
        }
        cout << endl;
    }
}
cs

 

 

 

'백준온라인저지' 카테고리의 다른 글

2884번 알람 시계  (0) 2019.11.07
11286번 절댓값 힙  (0) 2019.10.22
1238번 파티  (0) 2019.07.18
3062번 수 뒤집기  (0) 2019.07.18
2417번 정수 제곱근  (0) 2019.07.12