소개
- 現 어비스 대표 및 리드개발자
- 前 네이버 개발자
- 4년차 알고리즘 강사(네이버 / 카카오 / 라인 / 삼성 코딩테스트합격자 배출)
- 19, 20 IT 대기업 코딩테스트 합격자(All Solved)
- 자바스크립트 테스트 프레임워크 Mocha.js contributor
- 저서 《 면접을 위한 CS전공지식노트 》 2022 / 국내IT도서 1위 베스트 셀러
- 저서 《 실시간 모니터링 시스템을 만들면서 정복하는 MEVN 》 2021 / 국내IT도서 63위 베스트셀러
강의
전체2수강평
게시글
질문&답변
2024.05.17
2-J 코드 질문입니다.
안녕하세요 yuniv님 ㅎㅎ 정말 잘짜셨네요. ㅎㅎ 1.fill 함수를 정확히 잘 초기화하셨고 2.bool isC를 기반으로 구름 여부를 추적하신것도 잘하셨습니다. 완벽합니다. ㅎㅎ 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 1
- 24
질문&답변
2024.05.17
답은 맞았는데, 이상한 부분이 있어서 질문드려요
안녕하세요 google님 ㅎㅎ 이러한 경우는 DP의 중간값이 제대로 잘 쌓여지지 않아서 그렇습니다. 예를 들어 목표로 한 DP[5][0]은 잘 쌓였지만 중간에 DP[2][0]은 제대로 쌓이지 않은 것이죠. 이 때문에 DP 5, 0 을 하고 DP 2, 0을 하려고 할 때 미리 쌓여진 배열을 기반으로 처리를 할 때 -> 제대로 안쌓여서 -> 에러가 뜨는 것인데요. (원래는 차근차근 잘 쌓여야 합니다.) 이 방법을 해결하는 방법은 불필요한 로직을 지우며 올바르지 않은 로직을 찾는 방법이 유일합니다. 먼저 불필요한 로직을 지워볼까하는데요. 왜 targetW가 필요할까요? go 함수는 targetW 개의 전체 알약 중 restW 개의 전체 알약이 남아있고, consumeH 개의 반 알약이 사용된 상태에서 가능한 경우의 수를 계산하는 것 같은데요. 현재까지 소모한 전체 알약의 수 : consumeW 는 targetW - restW 로 계산되지만 이부분은 restW 와 consumeH 으로도 알 수 있지 않을까요? 왜 이러한 로직이 나오나요? if (restW > 0) { if (consumeW == consumeH) { cnt += go(targetW, restW - 1, consumeH); } else { cnt += go(targetW, restW - 1, consumeH); cnt += go(targetW, restW, consumeH + 1); } } 이거는 제가 생각했을 때, 전체 알약을 사용할 수 있는 경우 ( restW > 0 ), 현재까지 소모한 전체 알약 수와 반 알약 수가 같다면 전체 알약 하나를 더 사용하는데요. 왜이게 강제되어야 하나요? 제가 google 님 코드 중에 불필요한 부분을 없애가면서 다시 짜봤습니다. #include using namespace std; typedef long long ll; ll dp[31][31]; ll go(ll restW, ll consumeH) { if (restW == 0) { return 1; } if (dp[restW][consumeH] != -1) { return dp[restW][consumeH]; } ll cnt = 0; if (restW > 0) { cnt += go(restW - 1, consumeH + 1); } if (consumeH > 0) { cnt += go(restW, consumeH - 1); } dp[restW][consumeH] = cnt; return cnt; } int main() { ll num; memset(dp, -1, sizeof(dp)); while (true) { cin >> num; if (num == 0) { break; } cout 이렇게 하면 초기화 없이 잘 통과 됩니다. 참고 부탁드립니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 2
- 27
질문&답변
2024.05.16
2- I segmentation fault
안녕하세요 ㅎㅎ // if(s1.length() == s2.length()){ // int i = 0; // while(s1[i] == s2[i]){ // i++; // } // return s1[i] 이렇게만 bool 함수를 작성하셨다면 s1와 s2의 길이가 다를 때는 어떻게 하는지가 명시가 되어있지 않아서 에러가 뜨는 것 같습니다. 모든 경우의 수를 고려한 bool 함수를 구축해야 합니다. 또한 선생님께서는 size()를 사용하셨고 저는 length()를 사용했는데 size()와 length()의 장단점도 알고싶습니다 >> C++의 std::string 클래스에서 length() 와 size() 는 동일한 기능을 제공합니다. 저는 개인적으로 size()가 글자수가 적기 때문에 이를 애용하는 편입니다. 참고로 공통점은 다음과 같습니다. 공통점 length() 와 size() 는 모두 문자열의 길이(문자의 개수)를 반환합니다. 반환 값의 타입은 std::string::size_type 입니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 1
- 35
질문&답변
2024.05.16
안녕하세요! 버퍼 플러싱 관련하여 질문드립니다.
안녕하세요 사자님ㅎㅎ cin은 개행문자 전까지 입력을 받기 때문에 버퍼에 \n이 남아서 버퍼 플러싱이란걸 해야 함으로 이해했습니다 >>네 맞습니다. 다만 cin 자체만으로는 버퍼플러싱 안해도 됩니다. cin>> 문자열 입력받음 -> 그 다음 getline을 연속으로 입력받을 때 버퍼 플러싱이 필요합니다. 위의 문제로 입력 버퍼에 개행 문자가 남아있다면 이후에 데이터를 입력할 때 남아있는 개행문자에 걸려서 오류가 날 것으로 생각합니다. >> 네 맞습니다. 입력버퍼에 개행문자가 남아있다면 오류가 발생할 수도 있습니다. 다만 cin같은 경우 개행문자 단위로 입력을 받기 때문에 연속적으로 cin을 사용해서 개행문자로 분리가 된 문자열은 문제 없이 받을 수 있습니다. ex) 연속적인 문자열을 담는 코드. 예를 들어 aa bb cc 를 이렇게 하게 되면 정상적으로 aa bb cc 가 담아지게 됩니다. // Online C++ compiler to run C++ program online #include using namespace std; string tmp[3]; int main() { for(int i = 0; i > tmp[i]; } for(int i = 0; i 입력과 출력 aa bb cc aa bb cc string bufferflush; getline(cin, bufferflush); 의 코드로 남아있는 개행문자를 버퍼 플러싱 해주는것으로 사료되는데, 위 코드가 어떤 원리로 남아있는 개행문자를 처리해주는지 이해가 가지않습니다.. ㅠ >> cin으로 남아있는 개행문자를 없애기 위한 임시 문자열을 선언하고 해당 부분을 전부 getline()으로 받아 없애는 것입니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 2
- 37
질문&답변
2024.05.16
2-D (백준2573 영역구하기) 백터사용시 메모리 초과
안녕하세요 섭섭님 ㅎㅎ 좋은 의견 공유 감사드립니다. 참고로 해당 부분은 교안내의 다음 부분도 참고하시면 더 도움이 되실 것 같습니다. 참조에 의한 호출로 넘겨야 할 때 감사합니다.
- 0
- 1
- 24