해결된 질문
작성
·
100
0
안녕하세요 선생님 🙂 저번 질문에서 수강평 작성해달라고 말씀해주셨었는데요, 수강평은 강의를 모두 들은 후에 작성하는 것이 맞을 것 같아서 나중에 작성하겠습니다^^
오늘은 Counting Star 질문이 있습니다.
강의듣기 전에 먼저 풀어봤는데요, 결과 값은 정확히 나오고 있으며 선생님의 풀이와 차이가 있다면
array를 vector로 사용
char가 아닌 int로 for문을 사용
이렇게 2가지의 차이 밖에 없는 것으로 보이지만 백준에 제출하면 자꾸 오답으로 나옵니다 ㅠㅠ
아래는 제가 한 풀이 방식입니다. 의심되는 부분은 for문 안의 if (S[i] == NULL) break; 이 구문인데요, 문자열의 끝이 공백문자열이다보니 이 구문을 통해 공백문자열을 만난다면 break를 통해 반복문을 빠져나오도록 구현하였습니다.
어떤 문제가 있길래 자꾸 오답처리가 되는걸까요?
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string S;
cin >> S;
vector<int> vec(26);
for (int i = 0; i < 26; i++)
{
if (S[i] == NULL) break;
vec[(int)S[i] - 97]++;
}
for (auto i : vec)
cout << i << " ";
return 0;
}
답변 2
1
안녕하세요 유태님 ㅎㅎ
제가 유태님 코드를 살짝 다듬어 봤는데요. ㅎㅎ
이렇게 고치시면 됩니다. 구조자체는 괜찮습니다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
string S;
cin >> S;
vector<int> vec(26); // 크기가 26인 벡터를 생성하여 각 글자의 출현 횟수를 센다.
for (int i = 0; i < S.length(); i++) { // 문자열 S의 길이만큼 반복한다.
vec[(int)S[i] - 'a']++; // 해당 글자에 대한 카운트를 증가시킨다.
}
for (auto i : vec) {
cout << i << " "; // 각 글자의 출현 횟수를 출력한다.
}
return 0;
}
참고로 문자열 S의 마지막 인덱스 즉, s[s.length() - 1] 은 NULL이 아닙니다.
그리고 지금 보시면 인덱싱도 틀리셨어요 26까지가 아니라 "문자열의 길이"를 기반으로 하셔야 합니다. ㅎㅎ
그리고 다음번에 질문하실 때는 0주차 : 질문하는 방법 보시고 질문 부탁드립니다.
들여쓰기가 안된 코드는 제가 디버깅할 때 힘들어요 ㅠㅠ
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
1
안녕하세요, 인프런 AI 인턴입니다.
한유태님의 질문에 가장 잘 부합하는 답변을 찾아드린 것 같습니다. 질문에서 언급된 “1-B Counting Star” 질문과 관련하여 유사한 질문 사례가 있습니다. 해당 답변에서는 문자열 처리 방식과 관련된 배열 사용의 중요성을 설명하고 있고, 각 문자의 빈도수를 계산하는 방법을 다루고 있습니다.
1-B counting star 질문에서 김도형님이 매우 비슷한 문제로 질문하셨고, ‘큰돌’ 강사님께서 자세하게 답변해주셨습니다. 이 답변에서는 문자열에서 각 문자의 등장 횟수를 계산하는 로직에 대해 설명하고 있습니다. 특히, cnt[a-'a']++
의 로직을 통해 알파벳 문자의 빈도수를 계산하는 방법에 초점을 맞추고 있습니다. 이는 문자열을 처리하는 다른 방법에 대한 이해를 높이는데 도움을 줄 수 있습니다.
해당 질문에서는 for char a : str
를 통해 문자열 str
의 각 문자 a
에 대해 반복하며, cnt[a - 'a']++
를 통해 각 문자에 해당하는 배열의 인덱스를 찾아 값을 증가시키는 방법을 설명하고 있습니다. 이 방식은 한유태님의 문제 해결에 참고가 될 수 있습니다.
한유태님의 경우, if (S[i] == NULL) break;
구문이 의심되는 부분으로 언급되었습니다. C++에서는 문자열의 끝을 나타내기 위해 NULL 대신 '\0'
을 사용합니다. 즉, if (S[i] == '\0') break;
와 같은 방식으로 수정해볼 수 있겠습니다. 또한, 입력받은 문자열 S
의 길이만큼만 반복문을 실행해야 하므로, for (int i = 0; i < S.length(); i++)
와 같이 수정하는 것이 좀 더 정확할 수 있습니다.
자세한 사항은 위 링크를 참조하시길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
넵 감사합니다 선생님!