• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

안녕하세요 공부법 관련해서 질문드립니다.

22.05.06 06:47 작성 조회수 370

0

안녕하세요 큰돌님!
 
자바스크립트로 개발을 하다가 코테언어는 C++로 선택한 학생입니다.
강의교안을 한번 다 봤는데,
개념강의 1강에서 나오는 psum과 관련된 문제를 풀려고 하니까 처음부터 어떻게 코드를 적어야할지 감이 잘 안오는데,
 
다시한번 강의교안을 보면서 외우는 것이 좋을까요?
아니면 문제를 풀면서 익혀보는게 좋을까요?
 
잘 배워서 꼭 C++로 코딩테스트 잘 보고 싶습니다!
감사합니다

답변 3

·

답변을 작성해보세요.

0

송인성님의 프로필

송인성

2022.08.07

안녕하세요 큰돌님 교안 보면서 로그 찍어보던중에 궁금증이 생겨서 질문 남깁니다.

#include <bits/stdc++.h>
using namespace std;
vector<string> split(string input, string delimiter) { vector<string> ret;
long long pos = 0;
string token = "";
while ((pos = input.find(delimiter)) != string::npos) { token = input.substr(0, pos); ret.push_back(token);
cout << input.find(delimiter) << "\n"; ✅
 
input.erase(0, pos + delimiter.length());
} ret.push_back(input); return ret;
}

int main(){
string s = "안녕하세요 큰돌이는 바보에요 정말이에요!"; string d = " ";
vector<string> a = split(s, d);

/*
for(string b : a) cout << b << "\n";\
안녕하세요 큰돌이는 바보에요 정말이에요!
*/
}
 
해당 코드에서 ✅을 찍어보면,
15
12
12
가 나오는데 이 숫자가 나오는 이유가 궁금합니다!

한글이라서 이러한 index가 나오는것인지 궁금하고, 영어로 입력하고 index를 보면 순서대로 잘 나오는거같아서요!

저거 예제를 바꾸든가 해야겠어요 ㅠㅠ / 네 맞습니다. 한글이라 저런 숫자가 나와요. 컴파일러마다 다르긴 한데 한글은 한글자에 3바이트를 먹어요. 그래서 3 *5라서 15번째... 이런식으로 나오게 됩니다. 영어는 1개의 글자당 1바이트라 그렇지 않구요. ㅎㅎ 수정된 예시를 첨부합니다.   

#include <bits/stdc++.h>
using namespace std; 
 
vector<string> split(string input, string delimiter) {
    vector<string> ret;  
    long long pos = 0;
    string token = "";
    while ((pos = input.find(delimiter)) != string::npos) {
        token = input.substr(0, pos);  
        ret.push_back(token);  
        input.erase(0, pos + delimiter.length());
    }
    ret.push_back(input);
    return ret; 
}
vector<string> split_debug(string input, string delimiter) {
    vector<string> ret;  
    long long pos = 0;
    string token = "";
    while ((pos = input.find(delimiter)) != string::npos) {
        long long pos = input.find(delimiter); 
        cout << "POS : " << pos << '\n'; // 15 12 15 15
        if(pos == string::npos)break;
        token = input.substr(0, pos);  
        ret.push_back(token);  
        input.erase(0, pos + delimiter.length());
    }
    ret.push_back(input);
    return ret; 
}
 
  
int main(){
    string s = "안녕하세요 큰돌이는 킹갓제너럴 천재입니다 정말이에요!";
    string d = " "; 
    vector<string> a = split(s, d);
    string s2 = "aaaa bbb ccccc ee ddddddddd!";  
    vector<string> c = split_debug(s2, d);
    // 4 3 5 2 띄어쓰기를 찾아 해당 첫번째 인덱스를 반환한다.
    // 문자열이 erase되기 때문에 aaaa, bb 이런식으로 되는 것도 생각.
    for(string b : a) cout << b << "\n";
    /*
POS : 4
POS : 3
POS : 5
POS : 2
안녕하세요
큰돌이는
킹갓제너럴
천재입니다
정말이에요!
    */
} 

0

답변 감사합니다 큰돌님! 

강의교안 보고 조금더 공부해서 잘 풀어보도록하겠습니다! ㅎㅎ

0

안녕하세요.TG PIZZA BOY님 ㅎㅎ

  

일단은 알고리즘 교안을 다 외우셔야 합니다. 

예를 들어. 

배열 회전이다?

라고 했을 때 회전 하는 코드는 나올 정도로. 

벡터다?

라고 했을 때 push_back()이나 pop_back()은 외워서 나오실 정도로 학습을 하셔야 합니다. 

(그래서 보통 2주가 걸려요.)

 

이렇게 까지 하고 문제를 푸시는 것을 추천드리고.

문제를 푸실 때 2시간정도까지만 고민하고 그래도 안풀리신다면 답안과 강의보시면서 학습해나가시면

충분히 가능합니다. 

 

또 질문사항있으시면 언제든 말씀 부탁드립니다. 

감사합니다. 

강사 큰돌 올림.