본문 바로가기
CodingTest/백준

[c++] 백준 - 2204번: 도비의 난독증 테스트 (수정)

by Daybreak21 2023. 3. 23.

2204번: 도비의 난독증 테스트 (acmicpc.net)

#define _CRT_SECURE_NO_WARNINGS      
#include <iostream>
#include <cstring>
using namespace std;

int ReturnResultIndex(char word[][21], const int size) {
	bool check[20];
	for (int i = 0; i < size; i++) check[i] = true;

	int rep = size;
	for (int j = 0; j < 21; j++) {
		char min = 91;
        	//j번째 오는 글자들을 비교했을때 가장앞에 오는 글자를 min이라는 변수에 저장
		for (int i = 0; i < size; i++) {
			if (check[i] == true && word[i][j] < min) {
				min = word[i][j];
			}
		}

		for (int i = 0; i < size; i++) {
        		//마지막까지 남은 글자의 인덱스를 return
			if (check[i] == true && rep == 1) {
				return i;
			}
           		 //min값과 비교하여 최소값이 아닌 단어 검사에서 제외 
			if (check[i] == true && word[i][j] > min) {
				check[i] = false;
				rep--;
			}
		}
	}
}

int main(void) {
	int n = 1;
	while (n != 0) {
		char Origin_word[1000][21] = {};
		char word[1000][21] = {};
		cin >> n;
		for (int i = 0; i < n; i++) {
			cin >> Origin_word[i];
			
            //대문자로만 이루어진 Word배열 만들기 
			string s = Origin_word[i];
			int word_len = s.length();
			for (int j = 0; j < word_len + 1; j++) {
				if (Origin_word[i][j] >= 'a' && Origin_word[i][j] <= 'z') word[i][j] = Origin_word[i][j] - 32;
				else word[i][j] = Origin_word[i][j];
				//word[i][word_len] = '0';
			}
		}
        	//정답 출력
		cout << Origin_word[ReturnResultIndex(word, n)] << endl;
	
	}

	return 0;
}

 

1. 대소문자가 섞인 입력을 받는 OriginWord배열 생성

2. 사전식검사를 진행할 대문자만 들어있는 Word배열 생성 

//word[i][word_len] = '0'; 주석처리한 이부분은 같은 단어로 이루어진 길이가 다른 단어들을 비교할때를 위해 알파벳보다 아스키코드가 더 작은 문자를 끝에 붙여주었는데, 어차피 단어를 입력받을때 \0이 자동으로 붙기때문에 생략해주었다. 

 3. 사전상 가장앞쪽에 오는 단어기 담긴 배열의 인덱스를 반환하는 함수: ReturnResultIndex()

(1)받은 단어들의 가장앞글자씩 순서대로 아스키코드의 최솟값을 검사한다. 

(2)만약 i번째 단어의 j번째 글자가 아스키코드가 가장 작은 것보다 크면 check배열에서 제외한다. (check배열의 값이 F이면 검사하는 단어배열에서 제외,  rep(= size(n))값을 하나씩 빼줌)

(3)check배열에서 마지막 남은 한글자가 사전상 가장 앞에오는 단어 : rep가 1이 될때의 인덱스를 리턴하고 함수종료

 

내가 짠 코드의 요약은 n값 만큼 새로운 boolean배열을 만들어서 단어가 탈락할 때 마다 숫자를 빼서  가장 마지막에 남는 값을 골라낸다는 것이다. 

 

 

개선해야할 점 : 처음부터 이차원배열 1000개를 만들어놓고 시작해서 메모리의 낭비가 심하다. new delete를 사용하여 동적할당으로 이차원배열을 만들려고 시도하였지만 ReturnResultIndex함수 매개변수로 넘겨줄때 오류가 나길래 여러번 시도했는데 못고쳤다... 아직 2차원배열 동적할당이랑 포인터를 쓰는것을 잘 못하는것 같다. 더 공부하고 고쳐보겠음

 

※20230409수정

n의 숫자를 받아 배열을 할당하는 2차원배열로 수정하고 백준에 채점했더니 런타임에러(OutOfBounds)가 떳다. 

word[i] = new char[20]; 라고 배열을 20개만 할당했는데 왜 char20개를 넘기고 쓰레기값이 나오는걸까...

아아아아아아직 덜고침

 

 

 

고칠점이 있다면 댓글로알려주세요