궤도

[EPPER] 14회 5번 본문

💻 현생/⛓ 알고리즘

[EPPER] 14회 5번

영이오 2020. 10. 9. 20:36

문제

 


풀이

 

바라는게 참 많은 문제다. 일단 각 단어와 그 등장 횟수도 저장해야 하니 구조체를 사용한다. 단어들을 입력받으면서 등장 횟수를 0으로 초기화 한다. 단어 목록을 완성했으니, 첫 문자들도 first 배열에 저장한다.

 

등장 횟수가 같은 경우엔 사전순으로 단어를 선택한다고 했으니 배열에 들어온 단어들을 사전순으로 정렬한다. 그냥 삽입정렬을 단어 버전으로 적용했다. 혹시 모를 오류가 생길 수도 있으니까 그냥 맘편하게 strcpy와 strcmp를 썼다.

 

printWord 함수에서 각 문자에 대해 출력할 단어를 선택한다. 일단 문자에 대해 출력될 수 있는 단어가 여러개일 수 있으니 문자와 단어의 첫 문자가 일치하는 모든 단어를 출력 후보 배열 flag에 넣는다. 모든 단어를 다 탐색한 뒤, 후보 배열에 값이 하나뿐이라면 그걸 바로 출력하고 해당 단어의 등장 횟수에 1을 더한다. 후보 배열에 값이 2개 이상이라면 각 단어의 cnt를 비교해서 가장 작은 것을 출력한다. 제일 적게 등장한 단어의 개수가 여러개라고 해서 추가적인 코드를 작성할 필요는 없다. 애시당초 flag 배열에 사전 순으로 단어가 들어갔을 것이기 때문이다. 아무튼 이렇게 또 단어를 출력하고 해당 단어의 등장 횟수를 늘려주면 된다.


소스코드

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct word {
	char w[22];
	int cnt;
}word;

void sorting(word* words, int length) { //사전순으로 정렬
	char temp[22];
	for (int i = 1; i < length; i++) {
		strcpy(temp, words[i].w);
		int j = i - 1;
		while (j >= 0 && strcmp(temp, words[j].w) < 0) {
			strcpy(words[j + 1].w, words[j].w);
			j--;
		}
		strcpy(words[j + 1].w, temp);
	}
}

void printWord(char* first, word* words, int w_length, int f_length) {
	int* flag = (int*)malloc(sizeof(int) * w_length);
	int cnt;

	for (int i = 0; i < f_length; i++) {
		cnt = 0;
		for (int j = 0; j < w_length; j++) { //일치하면 후보 배열에 넣음
			if (first[i] == words[j].w[0])
				flag[cnt++] = j;
		}
		if (cnt == 1) { //후보 배열의 값이 하나면 바로 출력하고 등장 횟수 증가
			printf("%s\n", words[flag[0]].w);
			words[flag[0]].cnt++;
		}
		else { //여러개면 제일 적게 등장한 단어 찾음. 만약 모두 같다면 사전순으로 출력될 것(사전 순서로 넣었으니까)
			int min = words[flag[0]].cnt;
			int pos = flag[0];
			for (int k = 1; k < cnt; k++) {
				if (min > words[flag[k]].cnt) {
					min = words[flag[k]].cnt;
					pos = flag[k];
				}
			}
			printf("%s\n", words[pos].w);
			words[pos].cnt++;
		}
	}
}

int main() {
	int K, N;
	char input;
	char empty;

	scanf("%d %d", &K, &N);
	word* words = (word*)malloc(sizeof(word) * K);
	char* first = (char*)malloc(sizeof(char) * (N + 1));
	for (int i = 0; i < K; i++) {
		scanf("%s", &words[i].w);
		words[i].cnt = 0;
	}
	for (int i = 0; i < N; i++) {
		scanf("%c", &empty);
		scanf("%c", &input);
		first[i] = input;
	}
	sorting(words, K);
	printWord(first, words, K, N);
}
Comments