본문 바로가기

백준

2804)크로스워드 만들기

https://www.acmicpc.net/problem/2804


문제를 잘 읽어봐야 헷갈리지 않는다.


단어 A,B가 주어지는데 A와 B에서 공통 낱말은 항상 존재한다.


가장 처음으로 나타나는 공통 낱말을 기준으로 A와 B를 교차시켜야 한다.

위 그림처럼 공통 낱말이 A에서는 tA에 B에서는 tB에 나타났다고 하자.


그럼 아래 그림처럼 교차시켜야 한다.

A와 B를 교차해 이차원 배열 안에 담을 때 이들이 공통 낱말이 위치한 인덱스는 다음 그림처럼 쓰인다.


이중 반복문을 돌리기 위해 i를 고정시키고 j를 하나씩 증가시킬 때,


j가 tA인 순간에 wordB의 한 낱말을 꺼내다가 이차원 배열에 저장하는 것이다.


i가 tB가 되는 순간에 j를 증가시키며 wordA의 낱말을 이차원 배열에 저장한다.


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
48
#include<stdio.h>
#define WORD_LENGTH 31
#define TRUE 1
#define FALSE 0
 
int main() {
    char A[WORD_LENGTH];
    char B[WORD_LENGTH];
    char **crossWord;
    int isFound = FALSE;
    int lengthA = 0, lengthB = 0;
    int tA, tB;
 
    scanf("%s %s",A,B);
 
    for (int i = 0; A[i] != NULL;i++) {
        for (int j = 0; B[j] != NULL;j++) {
            if (!isFound && A[i] == B[j]) {
                tA = i;
                tB = j;
                isFound = TRUE;
            }
            if(i==0) lengthB++;
        }
        lengthA++;
    }
 
    crossWord = (char **)malloc(sizeof(char *)*lengthB);
    for (int i = 0; i < lengthB;i++) {
        crossWord[i] = (char *)malloc(sizeof(char)*(lengthA+1));
        
    }
 
    for (int i = 0; i < lengthB;i++) {
        for (int j = 0; j < lengthA+1; j++) {    
            crossWord[i][j] = '.';
            if (i == tB) crossWord[i][j] = A[j];
            if (j == tA) crossWord[i][j] = B[i];
            if (j == lengthA)crossWord[i][j] = NULL;
        }    
    }
 
    for (int i = 0; i < lengthB; i++) {
        printf("%s\n",crossWord[i]);
    }
 
    return 0;
}
cs


'백준' 카테고리의 다른 글

2033)반올림  (0) 2019.02.04
1912)연속합  (0) 2019.02.04
5032)탄산 음료  (0) 2019.02.03
1026)보물  (0) 2019.02.03
2108)통계학  (0) 2019.02.02