묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C++
(매우 긴 질문) 복습 점검 중 오류가 없는지 검토 받고싶어 질문남깁니다.
템플릿 섹션 공부 완료 후 실습을 통한 복습을하며 개인적인 질문을 스스로 질문해보고 답해봤습니다. 클래스 템플릿 부분이 잘 와닿지 않아 고심한 부분 위주로 남겨 제가 이해한게 맞는지 검토받고싶습니다. 같은 설명과 이야기가 반복될 수 있습니다ㅜ 두서없이 요약하지못해 죄송합니다. ▶아래는 템플릿이 선언(.h)과 정의(.cpp)가 나누어졌을 때 기반입니다.템플릿 클래스와 멤버 함수들의 선언이 명시된 .h를 통해 include한 쪽은 선언이 복사되어 포함된다.컴파일러가 .h를 포함한 곳은 번역단위가 선언만 이루어졌으니 전처리시점, 코드 작성 시점에는 템플릿을 해당 타입의 instantiation 을 할 예정인 명령어로 번역한다. 그리고 목적파일 생성 후 링커에 instantiation이 이루어질때 .cpp파일의 구현부 번역이 일어나는데, 해당 번역단위 입장에서는 인스턴스화 타입의 구현 정보가 존재하지않아 링커에 의한 오류가 생긴다.=> 이러한 이유로 구현부를 헤더파일에 모두 포함시키거나 어떤타입의 instantiation이 이뤄지질지 explicit instantiation 명시가 구현부(.cpp)에 필요하다. 이러한 특성때문에 만약 선언부에 정의가 함께되어있는 함수의 특수화 함수가 필요하다면 기본 템플릿 함수와 함께 정의 하되, inline 키워드를 붙여 동일한 함수임을 컴파일에게 명시해야한다왜? 헤더파일을 컴파일이 번역할때마다 기본 템플릿 함수와 특수화된 함수를 중복된 정의 함수라 판별하기때문이다.(다른 instance 템플릿 클래스 함수와 충돌이라 생각)그렇다면? 사용할 특정 타입만 내 마음대로 특성화 함수로 기본템플릿 함수의 정의와 함께 구현부에 구현할수있을까?할수는 있다고 생각한다. 하지만, cpp의 explicit instantiation과 다른 타입의 인스턴스로 컴파일 번역이 될 경우 문제가 발생한다..h에서는 인스턴스화 시에 해당 특성화 함수 정의를 할 수 있겠지만, .cpp에 해당 타입의 explicit instantiation이 명시되어 있지 않다면 특성화 제외 구현부가 나눠진 함수들은 인스턴스가 되지 못한다. => 헤더파일에서 정의부가 함께있는 함수는 컴파일러가 instantiation할때 타입별 template instance가 생기지만구현부가 cpp에 있을경우 explicit instantiation 없이는 해당 타입의 instance정보가 없어 해당 함수 사용시 오류가 발생한다.그럼? 특수화 함수 정의는 .h에! 기본템플릿 함수는 .cpp에 정의하고 특수화 함수와 동일한 타입의 template class Test<double>과 같이 explicit instantiation 해주면 되지않을까? 안된다! 정의부(.cpp)에서 기본템플릿 함수를 특수화 한 타입과 충돌에 문제가 발생한다.이미 .cpp파일 상단에 explicit instantiation을 선언해두었지만 아래에서 중복되는 타입의 특수화 함수정의 할시해당 인스턴스가 중복되는 이유로 중복선언된 함수가 되어버린다. inline을 써도 소용이 없다 해당 타입의 instance가 중복된거기때문이다! .h의 특수화함수 인스턴스 vs .cpp의 기본템플릿 인스턴스가 되어버린다.explicit instantiation가 이미 인스턴스화 되어있습니다! 라는 오류 (C2908)결론, 그래서 타입별 instance가 한정되어있다면 구현부(.cpp)에 explicit instantiation를 하고 기본템플릿 구현부를 만들어도 된다.만약 특수화가 필요한경우 구현부에 정의된 기본템플릿 함수를 헤더파일로 옮겨, 특수화할 함수에 inline키워드를 붙이고 클래스 외부에 특수화를 진행하면 된다.즉 템플릿 클래스내에 특수화가 필요한 멤버함수가 있다면 헤더파일에 inline키워드와 함께 구현할것선언부에 모든 템플릿 클래스 함수를 정의하기 어렵다면? .cpp파일에 구현부를 나누되 해당 특수화 인스턴스를 명시해두고, 다양한 대응을 해야하는 함수라면 그냥 선언부에 때려넣어야한다. ▶아래는 템플릿 클래스 내 friend키워드가 지정된 외부 함수가 템플릿 매개변수를 포함하는 인스턴스를 매개변수로 가질때 입니다.template<typename T>를 선언부에 명시 하지 않아도 되는 이유클래스내 멤버함수의 특징인 일반 멤버 함수들도 첫 번째 매개변수를 암시적으로 this포인터를 받는다. 멤버함수로 정의가 가능한 연사자 오버로딩 함수들은 선언부를 나눠서 같은 헤더파일에 클래스 외부에 따로 구현부를 작성해도 컴파일러에 의해 알아서 매칭이 이루어진다. 그렇다는 것은 템플릿 클래스의 경우 컴파일러에 의해 template class instantiation시 해당 연산자 오버로딩 함수는 멤버함수로써 this포인터로 인스턴스를 가리키기 때문에 선언부에 template<typename T>를 따로 명시하지않아도 된다.=> 그러나 구현부를 헤더가아닌 .cpp로 나눈경우에는 해당 함수를 번역할 시에는 template class에 대한 정보가 없으므로 template<typename T>를 모든 멤버함수에게 명시해주어야한다! 또한, 컴파일러가 번역 시 대신 특수화 함수가 함께 선언되는경우에는 중복정의가 아닌 같은 함수임을 명시하는 inline을 명시해야만 한다.템플릿 클래스의 외부 함수 friend 명시와 매개변수에 따른 매칭의 모호함외부함수로 정의하여 오버로딩해야하기 때문에 해당 인스턴스 매개변수의 멤버 변수에 접근하겠다는 의미로 friend를 붙여서 오버로딩을 구현시킨다.템플릿 클래스의경우 operaotr <<는 friend임을 선언부에 명시하게되면 해당 함수의 선언 보다는 friend 키워드를 사용하는 외부함수 명시에 불과한데(이 외부함수는 friend로써 해당 인스턴스의 멤버 변수 및 함수에 접근가능해!)이어서 동일한 헤더파일의 클래스 외부에 인스턴스 시 template 타입과 동일하게 하기위해 temaplte<typename T>를 붙여 정의를 하게된다.이 때, 템플릿 매개변수 T를 변수의 타입으로써 함수의 매개변수로 사용할 때는 컴파일러가 friend 외부함수 선언과 매칭 시키는것으로 번역한다. 그런데!!! 일반타입이아닌 템플릿 클래스 인스턴스를 (MyArray<T>) 매개변수로 사용하게 될때 문제가 발생한다.템플릿 클래스의 인스턴스를 템플릿 매개변수 T=> int의 인스턴스를 만들 때 컴파일러 번역에서 friend키워드가 붙은 외부함수의 매개변수 MyArray<T>를 MyArray<int>로 일반화하여 해석한다.때문에 정의부를 클래스 바깥 외부에 temaplate<typename T>로 정의하여 매칭을 유도시켜봤자, 컴파일의 해석에 따른 다른 인스턴스 취급을 받게되어 매칭으로 이어지지 못한다.때문에 클래스 내에 friend로 선언된 operator << 는 선언만 있게되는 외부 함수가 되고 정작 참조할 정의부가 없어 오류가 생겼던것이다.그래서 해당 함수를 템플릿 클래스 인스턴스 할때 함께 포함될 외부함수라는것을 컴파일러에게 알려주기 위해 template<typename T>를 따로 명시해줘야한다.반면, 템플릿 매개변수가 일반타입일 경우에는 매칭이 된다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-F 질문있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.https://inf.run/e3oLMabcdefghijklmnopqrstuvwxyz를 입력해서 해본 결과 r 까지는 잘 나오는데 s부터는 출력하였을 때 이상한 값들이 들어갑니다.(한글이 들어갑니다) 어느 부분에서 잘못된 것인지 알 수 있을까요?(대문자는 잘 나오는 것을 확인하였습니다) 혹시 아스키 코드표에 나와있는 값을 넘어가는 값이 저장되었다가 값을 빼주는 과정에서 코드표를 넘어가는 값이 저장되면서 오류가 발생한 것인가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
vector, array 관련 질문
안녕하세요 공부 중에 궁금한 점이 있어서 문의드립니다. 큰돌님께서는 보통 vector을 잘 사용하지 않으시고, 문제에서 주어진 최대 크기+여유분 만큼의 array를 선언해서 사용하시는 것으로 보이는데, array를 사용하는게 더 이점이 큰건지 아니면 그냥 취향 차이인건지 궁금합니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
백트래킹, 비트마스킹 질문입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 자바로 풀이하고 있는 학생입니다.비트마스킹 부분 강의를 듣던 중에 백트래킹으로 대부분 다 해결이 되는 것 같다고 느꼈습니다. 비트마스킹 암기와 이해가 조금 어려운 것 같은데 꼭 알고 가는게 좋을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요! 교안 관련은 아니고, c++ 코딩테스트 관련해서 질문 드려요
삼성전자 서류 합격을 받아서, 이번주 일요일에 코딩테스트를 보게 되었는데요. 1. 교안엔 <bits/stdc++.h>를 사용할 수 있다고 나오는데, 이건 코드를 제출하는 창에서 사용 가능한거고, 실제로 문제를 푸는 visual studio 2022 환경에선 사용이 안되는 거라고 봐도 될까요? 제가 알기론 visual studio 2022 환경에선 따로 stdc++.h 파일을 받아서 특정 디렉토리에 넣어야 가능한 걸로 알고 있거든요. 제가 원래는 맥북을 사용하다가 시험장에선 윈도우를 사용해야 하는 상황인데, visual studio 에서 c++로 시험을 볼때 주의해야 할 사항이나 세팅 사항이 있는지 궁금합니다.긴글 읽어주셔서 감사합니다. 좋은 강의 잘 듣고 있습니다!
-
미해결[켠김에 출시까지] UE5 다크앤다커 스타일의 익스트랙션 RPG (D1)
MaxWalkSpeed가 0으로 고정되는 문제 관련 질문드립니다
Interaction1, 또는 2 코드 이주 후 캐릭터가 움직이지 않는 문제가 있어서 원인을 쭉 분석해보니 CharacterMovementComponent의 MaxWalkSpeed가 0으로 세팅되어 있는 것을 발견했습니다. 게임 실행 후 에디터에서 직접 값을 올려서 움직여보면, 클라에서 잠시 움직이려다가 서버에서 검증로직이 돌아가 다시 제자리로 돌아가는 듯한 모습이 보여서 서버 사이드에서 정상적으로 초기화하지 않거나 replication되지 않은 것 같았습니다. 추가로 발견한 특이 사항으로는 UPackageMapClient::SerializeNewActor 함수에서, Actor = World->SpawnActorAbsolute 를 진행할 때 B_HeroCharacter_Base_C의 생성자 자체에서는 600이란 값으로 잘 초기화되지만 SpawnInfo.Template (FActorSpawnParameters) 에 들어간 애의 MaxWalkSpeed 값은 0으로 되어있는 바람에 최종적으로 0으로 세팅되는 것까지 확인했습니다. 뭔가 저 값이 0으로 오는 원인이 있을 것 같은데, attribute set이 잘못되었는지 관련 값을 세팅해주는 초기 GameplayEffect를 지정해주지 않은 것인지 정확한 원인을 찾는데 난항을 겪고 있어서, 혹시 관련하여 어느 부분을 보는 것이 좋을지 질문 드립니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6주차 교안
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 6주차부터는 왜 교안이 없나요..?!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-B번 질문 있습니다!
3-B번 보물섬 문제를 풀다가. 각 육지마다 BFS를 하는 것보다, 한 컴포넌트에서 BFS_1로 임의의 한 점에서 가장 먼 점을 찾고, 찾은 가장 먼 점에서 BFS_2로 또 가장 먼 점을 찾으면, 해당 컴포넌트에서는 가장 먼 점의 길이를 구할 수 있다고 생각하고 풀이하였는데 틀린 이유를 잘 모르겠습니다...이렇게 풀면 틀린 이유가 있을까요??항상 수업 너무 잘 듣고 있습니다. 감사합니다!#include <bits/stdc++.h> using namespace std; int n, m; string a; char mapp[54][54]; bool visited[54][54]; int dis[54][54]; int dy[] = {0,-1,0,1}; int dx[] = {1,0,-1,0}; queue<pair<int,int>> q; queue<pair<int,int>> q2; int max_val = 0; pair<int,int> bfs_1(int y, int x){ visited[y][x]=1; q.push({y,x}); pair<int,int> here; while(q.size()){ here = q.front(); q.pop(); for(int i=0;i<4;i++){ int ny = here.first + dy[i]; int nx = here.second + dx[i]; if(ny<0||nx<0||ny>=n||nx>=m) continue; if(visited[ny][nx]) continue; if(mapp[ny][nx]=='W') continue; visited[ny][nx] = 1; q.push({ny,nx}); } } return here; } int bfs_2(int y, int x){ dis[y][x] = 1; q2.push({y,x}); pair<int,int> here; while(q2.size()){ here = q2.front(); q2.pop(); for(int i=0;i<4;i++){ int ny = here.first + dy[i]; int nx = here.second + dx[i]; if(ny<0||nx<0||ny>=n||nx>=m) continue; if(dis[ny][nx]>0) continue; if(mapp[ny][nx]=='W') continue; dis[ny][nx] = dis[here.first][here.second] + 1; q2.push({ny,nx}); } } return dis[here.first][here.second]; } int main(){ cin >> n >> m; for(int i=0;i<n;i++){ cin >> a; for(int j=0;j<a.length();j++){ mapp[i][j] = a[j]; } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(mapp[i][j]=='W') continue; if(visited[i][j]) continue; pair<int,int> ret_1 = bfs_1(i,j); int max_dis = bfs_2(ret_1.first, ret_1.second) -1; max_val=max(max_val,max_dis); } } cout << max_val; return 0; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
자바스크립트로 포팅하는 방법
안녕하세요 강사님, 좋은 강의 제공해주셔서 감사합니다!저는 프론트엔드 개발자를 희망하여 JS 외 다른 언어 경험은 없는 상태입니다 ㅜ그래서 다름이 아니라, C++를 JS로 포팅하는 방법 관련해서 질문이 있습니다:) (0주차 + 교안)을 학습하고 주차별로 학습을 하려고 하는데 예를 들어 next_permutation()와 같이 JS에 없는 함수 및 C++에서만 제공되는 문법의 경우, 그때그때 next_permutation() 동작 원리를 찾아보면서 JS로 구현해보는 연습을 병행하는 것이 효율적일까요?아직 JS에 비해 C++ 및 알고리즘 경험이 많지 않다보니, 학습을 하면서 그 자체를 이해하려고도 하지만 자연스럽게 JS라면? 이라는 생각을 계속 하다보니 진도가 나가지 않는 것 같습니다.. 이렇게 학습하는 것이 맞는지도 조금 의구심이 들어서 혹시 이 부분에 대해서도 강사님의 명쾌한 조언을 듣고 싶습니다!중복되는 질문이지만, 정리해보면 JS로의 포팅을 중간중간 따라가는 방법과 일단은 JS는 고려하지 않고 C++ 알고리즘 자체를 구현하는 방법을 학습 후, 추후 한꺼번에 JS로 포팅하는 방법 중 권장되는 방식도 궁금합니다:)좋은 강의 제공해주셔서 감사드립니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
8-F 유형의 문제를 풀 때 어려운 점
안녕하세요 큰돌님.8-F처럼 톱니바퀴나 다이얼을 돌려서특정한 상태로 만드는 데 필요한 최소 횟수를 구하는 문제를 풀 때 어려운 점이 있습니다.이런 문제의 풀이는 주로 왼쪽 아니면 위쪽부터 탐색을 진행해 답을 찾습니다.하지만, 저는 내심 이런 불안감이 듭니다.'만일 최적의 횟수가 맨 위가 아니라, 중간이나 맨 하단에서 다이얼을 돌리는 방법에서 비롯된 거면 어떡하지'.'현재 위치 N에서 다이얼을 맞추지 않고, 그 다음의 위치에 있는 다이얼을 먼저 맞춘 후, 다시 위치 N으로 돌아와서 다이얼을 맞추는 게 최적일 수도 있지 않을까.'위와 같이 다양한 가능성을 염두하니, 풀이법을 떠올리는 데 어려움이 많습니다.제가 문제를 접근하는 방식이 어디가 잘못되었는지, 어떻게 고쳐야 하는 지 궁금합니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
백준 1911번 문제 정렬후 현재 위치를 갱신해가면서 찾을 수도 있지 않나요?
저는 물웅덩이가 시작되는 위치를 기준으로 정렬을 한 뒤에 현재 위치를 0으로 잡고 만약 물웅덩이가 시작되는 위치가 현재 위치보다 크다면 현재 위치는 물웅덩이 위치로 한뒤 현재 위치 = 현재 위치 + 널빤지 위치, 만약 현재 위치가 물웅덩이가 시작되는 위치보다 크고 물웅덩이가 끝나는 위치보다 작은 경우 현재 위치 = 현재 위치 + 널빤지 위치.이런식으로 현재 위치를 갱신해가면서 답을 구했는데 이 접근법은 이 문제에서만 유효한가요?아래는 자바 코드 입니다.package _5thweek; import java.util.PriorityQueue; import java.util.Scanner; public class Baekjoon1911 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int l = sc.nextInt(); PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> { if (a[0] > b[0]) { return 1; } else if (a[0] < b[0]) { return -1; } return 0; }); for (int i = 0; i < n; i++) { int start = sc.nextInt(); int finish = sc.nextInt(); pq.add(new int[]{start, finish}); } int ans = 0; int cur = 0; while (!pq.isEmpty()) { int[] poll = pq.poll(); int start = poll[0]; int end = poll[1]; while (cur < end) { if (cur < start) { cur = start; } ans += 1; cur += l; } } System.out.println(ans); } }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-Q 2636 시간초과
안녕하세요 2636번 치즈 문제 질문 드립니다.https://inf.run/LM71Q위와같이 행렬을 두개 만들어서 풀었는데 시간 복잡도가 10,000,000을 넘을 것 같진 않은데 자꾸 시간 초과가 뜨는 것 같습니다. 혹시 이 부분에 대해 어떻게 해야할 지 답변 주시면 감사하겠습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-H 질문있습니다
안녕하세요 강사님1-H 문제에 대해서 강사님과 다른 방법으로도 풀어보았는데(https://inf.run/L1p8z) 강사님의 구간합 방법(https://inf.run/4mSTg) 보다 시간이 20ms 가량 높게 나와서 궁금증에 질문드립니다. 구간합의 반복횟수 보다 적게 반복 한 것 같은데, 내부에 분기문과 queue 사용으로 인해 시간이 더 늘어나게 된걸까요? 맞다면 queue의 처리는 O(1)으로 알고 있어서 분기문과 queue 중 처리 속도 증가의 원인을 꼽자면 분기문이 더 큰 비중을 차지하는지도 궁금합니다 퀄리티 높은 강의와 지속적인 피드백 늘 감사드립니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-G 질문 있습니다.
http://boj.kr/2cd5a4c0ee0241ee8e0b68be6d2a9ac2 46%쯤에서 틀리는데 이전 질문 글들을 확인하니까 1 14 (정답은 5 4인데 5 1 이 출력됨)의 경우 왜 안되는 것인지 도저히 모르겠습니다...
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
DP 초기메롱 질문
DP(동적 계획법)에서는 " '초-기-메-롱' 패턴이 쓰인다고 하셨는데,이 패턴은 탑다운 방식에만 적용 가능한 건가요?그렇다면 바텀업 방식의 경우, 이 문제를 DP로 판단할 수 있는 기준은 무엇인가요?예를 들어 아래 두 가지 조건으로 DP 여부를 구분할 수 있을까요?점화식을 사용한다.이전 값을 그대로 가져와서 사용한다.또, dp[i] = dp[i-1] + dp[i-2] 같은 식도 메모이제이션이라고 볼 수 있나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-J번 질문있습니다
항상 좋은 강의 감사합니다.올려주신 답안 31번째 줄에 (s & (1<<k)) != 0) 이런 코드가 있는데 (s & (1<<k)) == 1)과 다른 의미인가요?0 또는 1 두가지 경우밖에 없어서 이렇게 코드를 짰는데 계속 답이 안 나와서 질문 드립니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-B 틀린 점을 모르겠습니다.
https://inf.run/Ryau5BFS를 이용해서 풀었는데 왜 틀린 지를 모르겠습니다...테스트 케이스는 통과 했습니다.
-
미해결홍정모의 따라하며 배우는 C++
3분 50초, 사용자정의 자료형 반환 시 복사에 대하여 궁금합니다.
3분 50초 부근에서 강사님께서 "파라미터로 참조를 받아 결과값을 내는 방식이 많이 사용되었지만, 최근에는 해당 자료형을 바로 반환하는 것이 추세이다" 라고 말씀하셨습니다.해당 객체를 return할때 임시객체를 생성 후 호출부에 반환하며 복사가 이루어지는 것으로 알고 있습니다. 사용자 정의 자료형은 만들기에 따라 크기가 결정되기 때문에 복사비용이 부담이 크다는걸로 압니다. 그렇다면 return과 동시에 객체를 생성하고 반환할 경우에는 복사가 이루어지지 않는 것인지 궁금합니다.+)구글링 및 ChatGPT로 검색해본 결과 컴파일러에 의해 최적화 되어서 복사가 일어나지 않도록 한다는데 제가 학습한 반환에 의한 복사가 일어나는 개념이 잘못된것인지 궁금합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-T 5557번 1학년 문제 질문입니다.
일단 제가 틀린 코드인데,#include <bits/stdc++.h> using namespace std; typedef long long ll; int n, a[102]; ll dp[102][102]; // sum은 음수가 되면 안됨. 20을 넘어서도 안됨. ll go(int sum, int cnt) { if (sum < 0 || sum > 20) return 0; if (cnt == n - 1) { if (sum == a[n]) return 1; else return 0; } ll& ret = dp[sum][cnt]; if (ret != -1) return ret; ret = 0; ret += go(sum + a[cnt + 1], cnt + 1); ret += go(sum - a[cnt + 1], cnt + 1); return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; memset(dp, -1, sizeof(dp)); for (int i = 1; i <= n; ++i) { cin >> a[i]; } cout << go(0, 0); }물론 이 방법이 불필요한 과정이 들어있는 것은 맞지만, 예제도 다 통과했고 결국 같은 과정을 거친다고 생각했는데, 오답이라고 나옵니다.그래서 a[0]부터 접근하는 코드로 변경했을 때는 정답이라고 나오는데 어떤 차이점인지 잘 모르겠습니다.https://inf.run/hL4B9
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-P질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include<iostream> #include<algorithm> #include<vector> using namespace std; int n,ret; vector<int> v; stack<int> st; int check(int i,vector<int> &v){ int cnt=0; int mx =0; for(int j = i+1; j<n; j++){ if(v[j]<= v[i]){ if(v[j]>=mx && v[i]>=mx) { cnt++; if(j == i+1) mx = v[j]; else mx = max(mx,v[j]); } else{ break; } } else if(v[j]>v[i]){ cnt++; break; } } return cnt; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n; for(int i =0; i<n;i++){ int num; cin>>num; v.push_back(num); } for(int i=0;i<n-1;i++){ ret += check(i,v); } cout<<ret; return 0; } 이 코드에서 예제는 통과하지만 틀리는 이유를 잘 모르겠습니다. 처음에는 스택을 하려고 했다가 매번 특정한 위치에 접근하는 것이 스택은 안되기에무식한 방법으로 풀어보는 시도를 위해 vector를 이용해 보았습니다(번외 질문반례는 순수 노가다를 통해서 찾는건가요? 아님 다른 방법이 있을까요?