본문 바로가기
알고리즘 문제풀이/백준

[백준/C++] 10809. 알파벳 찾기

by 이제ise이제 2021. 10. 18.

[순서]

  • [구상]
  • [정답1] -- [해결1] -- [레퍼런스1]
  • [해결2+정답2] -- [레퍼런스2]
  • [ps]

 

[구상]

1. S를 입력받는다. (입력받을 S: 문자열? 문자형 배열?)

2. 알파벳(abcd~xyz)과 S의 철자를 비교해서 위치를 파악한다. (S를 뜯어 보자.. 알파벳 하나하나랑 비교하려면 알파벳을 배열로? 비교는 반복문? 조건문?)

3. 알파벳의 위치를 알았으면 그 뒤의 철자들과는 비교하지 않는다. (비교를 안할 거면 반복문을 탈출?)

4. 다음 알파벳으로 넘어간다. (반복문 이어서)

5. 모든 알파벳과 비교가 끝나면 위치들을 순서대로 출력한다. (위치들을 담아둘 변수?)

 


 

[정답1]

#include<iostream>
#include<cstring>

int main() {
char S[101] = { 0, }; // 입력받을 단어 S
	char alphabet[26] = { 0, };
	int alphabetPos[26] = { 0, };
	int pos = 0;

	//알파벳 넣기
	for (int i = 0; i < 26; i++) {
		alphabet[i] = (char)(97 + i);
		alphabetPos[i] = -1;
	}

	//단어 입력받기
	std::cin >> S;

	//단어의 철자들의 위치
	for (int i = 0; i < 26; i++) {
		for (int j = 0; j < (unsigned)strlen(S); j++) {
			if (alphabet[i] == S[j]) {
				alphabetPos[i] = pos;
				break;
			}
			else {
				pos++;
			}
		}
		pos = 0;
	}

	//출력
	for (int i = 0; i < 26; i++) {
		std::cout << alphabetPos[i] << " ";
	}
    
	return 0;
}

 


 

[해결1]

엄청 틀렸다. 몇 번을 테스트 돌려봐도 잘만 출력되는데 자꾸 틀렸다고 해서 지인한테 헬프 요청. 원인은 S의 범위.

	char S[101]; // 입력받을 단어 S

처음에는 널문자를 고려하지 않아서 char S[100]으로 잡았는데 이게 문제였다.

 

단어 baekjoon을 입력하면 배열 S에는 

b a e k j o o n

이 아니라

b a e k j o o n \0

으로 저장된다.

 

문제에서는 "단어의 길이는 100을 넘지 않으며"라고 했기 때문에 널문자를 고려해 배열 크기를 101로 잡아야한다.

 

 


 

[레퍼런스1]

http://www.cplusplus.com/reference/cstring/strlen/?kw=strlen 

 

strlen - C++ Reference

123456789101112 /* strlen example */ #include #include int main () { char szInput[256]; printf ("Enter a sentence: "); gets (szInput); printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput)); return 0; }

www.cplusplus.com

 

알파벳과 비교할 때 for (int j = 0; j < 101; j++) 으로 하면 틀렸다고 뜬다.

 


 

[해결2 + 정답2]

char 형 배열의 문제였지만 이를 더 간단하게 해결하려면 <string>을 이용하면 된다.

배열 크기를 101이냐 100이냐를 고민할 것 필요가 없다.

 

이때는 #include<cstring>이 아닌 #include<string>을 써야한다는 점과, 문자열의 길이를 S.length()로 써야한다는 점만 다르다.

 

#include<iostream>
#include<string> //★
int main{
	std::string S; //★
	char alphabet[26] = { 0, };
	int alphabetPos[26] = { 0, };
	int pos = 0;

	//알파벳 넣기
	for (int i = 0; i < 26; i++) {
		alphabet[i] = (char)(97 + i);
		alphabetPos[i] = -1;
	}

	//단어 입력받기
	std::cin >> S;

	//단어의 철자들의 위치
	for (int i = 0; i < 26; i++) {
		for (int j = 0; j < S.length(); j++) { //★
			if (alphabet[i] == S[j]) {
				alphabetPos[i] = pos;
				break;
			}
			else {
				pos++;
			}
		}
		pos = 0;
	}

	//출력
	for (int i = 0; i < 26; i++) {
		std::cout << alphabetPos[i] << " ";
	}
    
    return 0;
}

 


 

[레퍼런스2]

http://www.cplusplus.com/reference/string/string/length/

불러오는 중입니다...

 

 


 

ps. 지인의 조언을 참고로 해서 아스키코드 부분을 조금 줄였다.

/* BEFORE */
	char S[101] = { 0, }; // 입력받을 단어 S
	char alphabet[26] = { 0, };
	int alphabetPos[26] = { 0, };
	int pos = 0;
   	int num = 97; //★
    
	//알파벳 넣기
	for (int i = 0; i < 26; i++) {
		alphabet[i] = (char)num; //★
		num++; //★
		alphabetPos[i] = -1;
	}
    
        
/* AFTER */
	char S[101] = { 0, }; // 입력받을 단어 S
	char alphabet[26] = { 0, };
	int alphabetPos[26] = { 0, };
	int pos = 0;
    
	//알파벳 넣기
	for (int i = 0; i < 26; i++) {
		alphabet[i] = (char)(97+i); //★
		alphabetPos[i] = -1;
	}

좀더깔끔해짐

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준/C++] 10799번 쇠막대기  (0) 2024.04.23
[백준/C++] 1753번 최단경로  (0) 2023.10.10