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개를 넘기고 쓰레기값이 나오는걸까...
아아아아아아직 덜고침
고칠점이 있다면 댓글로알려주세요
'CodingTest > 백준' 카테고리의 다른 글
[c++] 백준 - 1747번: 소수&팰린드롬 (0) | 2023.04.07 |
---|---|
[c++] 백준 - 5800번: 성적 통계 (0) | 2023.03.25 |
[C언어] 백준 - 4673번: 셀프 넘버 (0) | 2023.02.03 |
[C언어] 백준 - 3052번: 나머지 (0) | 2022.11.29 |
[C언어] 백준 - 10818번: 최소, 최대 (0) | 2022.11.29 |