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 |