[순서]
- [구상]
- [정답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 |