게시글
질문&답변
2024.09.17
for문 초기값 설정 방식에 대한 시간 초과 질문 있습니다.
안녕하세요 영찬님 ㅎㅎ 강의 외의 문제에 대한 질문은 받지 않습니다. 다만, 이 두개의 코드의 차이점은 있지만 사실 그렇게까지 시간초과가 차이나는 코드라고 볼 수 없다고 생각합니다. 제생각에는 이 경우 문제가 너무 타이트하게 주어져서 그런 것 같습니다. 감사합니다.
- 0
- 2
- 9
질문&답변
2024.09.15
1-L 질문드립니다.
안녕하세요 김준님 ㅎㅎ 만약 abs 를 사용한다면, m = 10 이고 numbers[i] = 14 일 때, abs(10 - 14) = abs(-4) = 4 가 됩니다. 즉 -4가 나와서 -> 해당 경우의 수는 배제가 되어야 하는데 갑자기 4를 찾게 되서 UB가 발생하게 됩니다. 하지만 이 abs를 쓸 수 있는 방법이 있습니다. 바로 sort() 오름차순을 쓰면 되는데요. 예를 들어 오름차순 정렬을 하면 -> a, m , b 이렇게 있다고 했을 때 a 여기서 m - a는 b가 나오며 양수입니다. 자 그 다음 b를 만났을 때 어차피 start부터 탐색을 이어나가니 abs를 걸어서 -> 양수 a가 나오더라도 a는 탐색범위에서 벗어나니 abs를 써도 로직상 문제가 없게 됩니다. 전체 코드는 다음과 같습니다. #include using namespace std; /* 갑옷 재료는 번호가 있다. 갑옷은 2개의 재료로 만든다. 두 갑옷의 번호를 합쳐 M이 되면 갑옷이 된다. 1 &numbers) { int sum = 0; if (n == 1 || m == 1 || m > 200'000) { cout > n >> m; vector numbers; for (int i = 0; i > num; numbers.push_back(num); } Solution(n, m, numbers); return 0; } 김준님도 즐추보내세요 ㅎㅎ 감사합니다.
- 0
- 2
- 14
질문&답변
2024.09.15
5-P 질문입니다.
안녕하세요 sjw님ㅎㅎ 반례입니다. 입력: 5 10010011 01010011 11100011 01010101 01010011 10 1 1 2 1 3 1 4 1 1 -1 2 -1 3 -1 4 -1 5 1 5 -1 출력: sjw님 코드 : 2 답 : 5 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 2
- 16
질문&답변
2024.09.15
문제 접근 방법
안녕하세요 재현님 ㅎㅎ 저도 조건이 색종이가 각 5개라 25개이고 100개의 격자점에서 25개를 골라서 100C25 그 후에 11111,22222,33333,44444,55555 를 나열해서 가능한지 아닌지 판단해야하기 때문에 -> 이부분은 쉽게 판단하기 위해 색종이의 크기를 배제하여 100C25라 표현한 것입니다. 색종이 크기까지 고려해서 경우의 수 잡기는 어렵습니다. -> 처음에 문제를 접했을 때 이런식으로 어느정도 어림잡아 생각하는 것이 좋습니다. 하지만 한번 정확히 계산해볼까요? #include using namespace std; const int N = 10; int grid[N][N]; int paper_count[6] = {0, 5, 5, 5, 5, 5}; bool canPlace(int y, int x, int size) { if (y + size > N || x + size > N) return false; for (int i = 0; i 0 && canPlace(y, x, size)) { place(y, x, size, 0); paper_count[size]--; total += solve(y, x + 1); place(y, x, size, 1); paper_count[size]++; } } return total; } int main() { for (int i = 0; i > grid[i][j]; } } int result = solve(0, 0); cout 입력: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 출력: 3925 총 경우의 수는 3925 수준으로 굉장히 적게 나오는 것을 알 수 있습니다. 100개의 격자점을 대충 4x4로 감싼다고 했을 때 거의 다 채워지기 때문에 4개정도가 들어가기 때문에 이 문장이 이해가 가지 않습니다. 4*4로 총 5개까지 -> 10 * 10의 격자점이 있을 때 4 짜리 색종이로 4개밖에 못들어갑니다. 어떻게 5개가 들어가나요? 생각하고 다시 풀어도 백트래킹까진 생각할 자신이 없네요 ㅠㅠ -> 음 문제를 처음에 봤을 때 문제 범위를 보고 너무 시간복잡도가 크구나 라는 생각을 가질수는 있습니다. 그러나 이문제는 내가 실제로 색종이를 붙여본다고 생각했을 때 -> 경우의 수가 그렇게 많이는 나오지 않는구나 하고 생각할 수 있습니다. 예를 들어 4짜리 붙인다고 했을 때 사실 말이 100C4이지 붙일 수 있는 경우의 수 자체가 그렇게 많지는 않을 겁니다. 자 그러면.. 그냥 효율적으로 붙여볼까 하고 판단할 수도 있지만 -> 일단 무식하게 먼저 큰돌님이 해보라고 했으니 -> 무식하게 해보자 -> 생각해보니 이거 색종이가 큰 것 부터 하면 경우의 수 줄일 수 있겠네 -> 백트래킹 -> 이게 안되면 효율적으로 하는 그리디한 방법을 생각해보자. 이렇게 들어가시면 됩니다. 어느 정도 경우의수가 나올때 백트래킹으로 시간을 줄여서 성공할 수 있겠구나 라고 생각하시나요..? -> 보통은 1억까지는 괜찮다고 생각하고 + 앞의 답변처럼 들어가시면 됩니다. 즐거운 추석보내세요 ㅎㅎ 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 2
- 15
질문&답변
2024.09.15
안녕하세요 강의 학습 방법에 대해 질문드립니다
안녕하세요 ㅎㅎ 질문) 해당 강의의 경우 시간복잡도와 처럼 이미 알고있는 내용의 개념설명 같은 경우는 과감하게 스킵하고 추천해주신 문제 위주로 풀어도 될지 궁금합니다 -> 음.. 2배속으로 빠르게 듣는 것을 추천드립니다. 제가 중간중간에 팁을 드리기 때문에 그부분을 놓칠 수도 있어서요 ㅎㅎ 개념의 경우 얼마 안되니 2배속으로 들으시면 빠르게 들으실 수 있으실 것 같습니다. 감사합니다.
- 0
- 2
- 12
질문&답변
2024.09.14
누적합 인덱스 1부터 질문
안녕하세요 김준님 ㅎㅎ 그럼 누적합을 만들 원본배열 a같은 경우도 인덱스 1부터 시작해야하는건가요? -> 네 맞습니다. 저기서 a[0]에 0을 담아두고 하시면 됩니다. 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 2
- 15
질문&답변
2024.09.14
1-H 질문입니다.
안녕하세요 김준님 ㅎㅎ 코드보시면요 불필요한 로직이 있는데요. 개행문자를 기반으로 주어지는 입력을 굳이 getline -> split으로 받을 필요는 없습니다. cin이나 scanf를 사용해주세요. 전반적으로 로직은 잘 짜셨는데요. ㅎㅎ vector result; for (int i = k; i 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 2
- 15
질문&답변
2024.09.14
7-e 코드 질문 있습니다!
안녕하세요 ㅎㅎ 코드리뷰는 다음과 같습니다. 테스트케이스를 while루프통해서 해야하는데 해당 부분이 안되어있습니다. + 상태값이 올바르게 안들어가있습니다. 이 문제에서 중요한 점은 ta, tb 입니다. 한개짜리 반개짜리의 수인 것이죠. 그러나 DP배열을 보면 day, {0 or 1} 로 되어있어 올바르게 메모이제이션이 되지 않는 코드입니다. 제가 수강생님 코드를 다듬어봤는데요.ㅎㅎ 참고부탁드립니다. #include using namespace std; long long dp[31][31]; long long move(int tA, int tB) { if (tA == 0 && tB == 0) return 1; if (dp[tA][tB] != -1) return dp[tA][tB]; long long ret = 0; if (tA > 0) ret += move(tA - 1, tB); if (tB > 0) ret += move(tA + 1, tB - 1); dp[tA][tB] = ret; return ret; } int main() { while (true) { int N; cin >> N; if (N == 0) break; memset(dp, -1, sizeof(dp)); cout 또 질문 있으시면 언제든지 질문 부탁드립니다. 좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :) 감사합니다. 강사 큰돌 올림.
- 0
- 2
- 14
질문&답변
2024.09.14
오버라이딩에 수퍼콜 내용이 포함되면 더 좋을 것 같습니다 :)
안녕하세요 유태님 ㅎㅎ 해당 부분은 검토해보도록 하겠습니다. 좋은 의견 감사합니다. ㅎㅎ
- 0
- 2
- 12
질문&답변
2024.09.14
자바 코드를 C++코드로 변형하면서 궁금한 점이 생겼습니다 :)
안녕하세요 유태님 ㅎㅎ 1번답변을 드리면요. 저렇게 호출하시면 객체를 호출 -> 함수호출하게 되는 꼴입니다. Person::talk(*a, *b) 이렇게 호출해야 메모리할당이 1번만 됩니다. 참고코드는 다음과 같습니다. #include using namespace std; class Person { public: // constructor Person() : name("alanwalker"), IQ(100), str(100) { } Person(string Name, int Iq, int Str) { name = Name; IQ = Iq; str = Str; } // 메서드 void levelup() { IQ = IQ + 1; str = str + 1; cout > 인스턴스 a->levelup(); class Person* b; // 객체 b = new Person("한유태", 1000, 1); // 인스턴스 b->levelup(); a->talk(*a, *b); b->talk(*a, *b); Person::talk(*a, *b); return 0; } 아 그리구 즐거운 추석 보내세요 ㅎㅎ 감사합니다.
- 0
- 2
- 19