궤도

[EPPER] 14회 10번 본문

💻 현생/⛓ 알고리즘

[EPPER] 14회 10번

영이오 2020. 10. 9. 21:30

문제

 


풀이

 

먼저 위 그림에 나오는 키보드를 만든다. 그리고 목적지를 pos 배열에 저장하고 사용자가 지금까지 입력한 배열을 input에 넣는다. 그런 다음 compareStr 함수를 사용해 현재 input에서 선택할 수 있는 단어를 고른다. 그냥 input의 처음부터 끝까지 비교하며 전부 일치하는지 확인하는 거다. 일치한다면 해당 단어의 다음 문자를 배열에 넣고, 그 배열을 기반으로 changePad 함수에서 키보드를 바꿔준다.

 

약간 노가다성 코드가 없잖아 있는데 문제 자체에 노가다성이 있지 않은가 싶다.


소스코드

 

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

char keypad[5][9] = { {'*', '*', '*', 'A', 'B', 'C', 'D', 'E'}, {'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M'}, {'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U'}, {'V', 'W', 'X', 'Y', 'Z', '*', '*', '*'} };
char pos[51][21];

void changePad(char* arr, int length) {
	bool check[5][9];
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 8; j++) {
			check[i][j] = false;
		}
	}
	for (int i = 0; i < 4; i++) { //입력할 수 있는거라면 체크
		for (int j = 0; j < 8; j++) {
			for (int k = 0; k < length; k++) {
				if (keypad[i][j] == arr[k])
					check[i][j] = true;
			}
		}
	}
	for (int i = 0; i < 4; i++) { //체크안된 것들 별로 바꿈
		for (int j = 0; j < 8; j++) {
			if (!check[i][j])
				keypad[i][j] = '*';
		}
	}
}

void compareStr(char* input, int length, int num) {
	char arr[51];
	int cnt = 0;

	for (int i = 0; i < num; i++) {
		bool isSame = true;
		for (int j = 0; j < length; j++) { //문자열 비교해서 같은지 확인
			if (pos[i][j] != input[j])
				isSame = false;
		}
		if (isSame) { //같다면 그 다음 문자 배열에 투입
			arr[cnt++] = pos[i][length];
		}
	}
	changePad(arr, cnt);
}

int main() {
	char input[21];
	int N;

	scanf("%d", &N);
	for (int i = 0; i < N; i++)
		scanf("%s", &pos[i]);
	scanf("%s", &input);
	compareStr(input, strlen(input), N);
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 8; j++)
			printf("%c", keypad[i][j]);
		printf("\n");
	}
}
Comments