묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C++
2진수 1010 0010 을 무부호 10진수로
3.7 이진수마지막 문제풀이에서 2진수 1010 0010 을 무부호 10진수로 바꾸는 문제가 있엇는데문제에서 2진수는 부호가 있는지 없는지 알려주지 않았으니 무부호 10진수로 바꾸더라도 답이 2개가 나올 수 있는거 아닌가요?부호가 있는 2진수인 경우 -> 34부호가 없는 2진수인 경우 -> 162
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-N 네 방향 탐색, dp 적용 관련 질문드립니다.
안녕하세요! dfs랑 dp 구조에 대해 공부하려고 조금 다양한 시도를 해보다 궁금증이 생겨서 나름대로 스스로 이해를 해봤는데 제대로 이해한것인지 모르겠어서 질문 드립니다.제가 이해한 내용이 맞는지 확인 부탁드립니다! 궁금증은1) 네 방향으로 탐색하면 어떻게 되는지(순차탐색을 하는 이유)2) dp 를 적용할 수 는 없는지 이 두가지입니다. 1)번은 생각보다 구현자체가 복잡해서 아이디어만 정리하고 포기를 했고, 2)번에 대해 구현한 코드는 아래와 같습니다. https://www.acmicpc.net/source/89683214그리고 1,2번에 대해 제가 나름대로 이해한 방식은 다음과 같습니다. Q1. DFS 함수를 int형 반환값으로 구현하고 상하좌우 네 방향으로 탐색할 때, 단순 DFS 완전탐색과 DP 구조로는 해결이 어려운 이유는 무엇인가?A. 네방향 탐색 시 모든 완전탐색의 경우의 수를 통해 최소값을 찾아야 한다. 이때 "하나의 경우"는 여러 분기에서 "하나의 가지"를 의미한다. 그러나 DFS로 상하좌우 탐색을 하면, 여러 방향으로 분기되며 반환값이 생기고, 남은 1의 개수가 0이 되는 것을 기저조건으로 한 함수 구조에서 매개변수가 하나로 전달되지 않는다. (ex. 1이 5개 남았을 때 왼쪽으로 탐색하여 3개 완료, 오른쪽으로 이동하여 2개 완료하는 완전탐색이 가능하나 실제로 매개변수가 0이 되는 경우가 없음)이러한 방식으로 문제를 해결하려면 현재 탐색 방향 외의 방향에 존재할 수 있는 1이 있는 칸을 탐색하는 별도의 함수(a)가 필요하다. 이 함수를 현재 재귀함수의 네 방향 반복문이 종료된 후 호출되어야 완전한 탐색이 가능해진다. Q2. 시간복잡도를 줄이기 위해 DP 적용가능 여부. 첫 풀이 시도가 틀린 이유는?A. 이 문제에서 상태값은, "현재 y좌표, 현재 x좌표, 남은 1의 개수, 지금까지 붙여온 종이의 배치 구조" 가 필요하다. (이걸 다 저장한다면 부분 최적해가 보장되어 dp 사용가능하다고 이해했습니다.) 처음에는 순차탐색을 보장한다면 지금까지의 배치 구조를 저장하지 않아도 되지 않을까했다. 남은 색종이 종류별 개수는 별도 배열로 관리하기도 하고, 애초에 배치 구조를 저장하면 자동 결정되는 것이니 굳이 또 저장할 필요 없다. 감사합니다 ㅎㅎ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
큰돌님 4-H 질문 있습니다.
http://boj.kr/40f5fab72b2243a7840703f41c546807 강의를 듣기 전에 먼저 풀어보았는데요 제 코드같은 경우 그래프탐색을 3번이나 반복하고 강의처럼 DFS를 쓰지 않았습니다. 푸는데 오랜 시간이 걸린것은 물론이고 큰돌님 코드가 너무 깔끔해서 저는 어느 부분에서 최적화를 할 수 있었는지 궁금합니다.
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
C언어로 코드를 짜면 채점 시에 한 문제 빼고 시간 초과가 발생하는데 해결하는 방법이 있을까요?
#include <stdio.h> #include <stdlib.h> int main(){ int n, res=0; scanf("%d", &n); int* arr = (int*)malloc(n+1); int* dy = (int*)malloc(n+1); for(int i=1; i<=n; i++){ scanf("%d", &arr[i]); } dy[1] = 1; for(int i=2; i<=n; i++){ int max=0; for(int j=i-1; j>=1; j--){ if(arr[j]<arr[i] && dy[j]>max){ max = dy[j]; } } dy[i] = max + 1; if(dy[i]>res){ res = dy[i]; } } printf("%d\n", res); return 0; }이런 식으로 C로 코드를 짰습니다.시간 초과 문제를 해결할 수 있는 방법이 있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
조합 함수의 인자인 벡터에 &을 붙이지 않아도 괜찮나요?
안녕하세요 큰돌님, 친구와 이야기하다가 궁금한 것이 생겨 질문 남깁니다. 영상에서 combi의 인자로 vector<int> b를 두셨는데, vector<int> &b로 하지 않아도 문제는 없을까요? 큰돌님 풀이가 익히기 쉬워 그렇게 하고 싶은데 메모리문제가 생길 수 있다고 이야기를 들어서요.
-
미해결홍정모의 따라하며 배우는 C++
안녕하세요 혹시 제가 이해한게 맞을까요
void printColorName(Colors color){ if (color == Colors::BLACK) std::cout << "Black" << std::endl; else if (color == Colors::WHITE) std::cout << "White " << std::endl; else if (color == Colors::RED) std::cout << "Red" << std::endl; 여기서 매개변수가 Colors color인데enum타입의 클라스 Colors의 오브젝트를 color라는 이름으로 매개변수를 받는다음에 if문이 실행되는거 맞죠? 그 오브젝트가(attribute가) 될 수 있는거는 BLACK,WHITE RED GREEN,BLUE만 가능하구 매개변수로 줄 떄, Colors::BLACK이렇게 줘야하구요
-
해결됨[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
Asset Manager 설정 중 "Is Editor Only" 옵션에 대한 궁금증
안녕하세요?6.1 Teleport 강의에서 50:22 부분에 궁금한게 있는데요.Asset Manager가 L_ShooterGym을 스캔할 수 있도록 경로를 설정하는 건데, "Is Editor Only" 이 부분은 왜 체크해야 하나요..? 이 부분이 어떤 기능을 하는 것인지 궁금합니다.이걸 체크하지 않으니 DA_ShooterGame_ShooterGym의 MapID에 L_ShooterGym가 목록으로 표시되질 않네요. (설정 적용 후에 스캔을 위한 에디터 재실행은 했습니다. 엔진 버전은 5.4입니다.) FPrimaryAssetTypeInfo 구조체의 bIsEditorOnly 멤버 변수와, UAssetManager의 ScanPathsForPrimaryAssets() 멤버 함수가 이 기능과 관련있어 보이는데 코드를 봐도 잘 이해가 안되네요...
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 2차원 배열 90도 회전 관련 질문
#include <bits/stdc++.h> using namespace std; const int n = 3; const int m = 4; void rotate_left_90(vector<vector<int>> &key){ int n = key.size(); int m = key[0].size(); vector<vector<int>> temp(m, vector<int>(n,0)); for(int i = 0; i<m; i++){ for(int j = 0; j<n; j++){ temp[i][j] = key[j][m-i-1]; } } //key.resize(m); -> @@@@@@@ //key[0].resize(n); -> @@@@@@ key = temp; return; } int main(){ vector<vector<int>> a = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, }; rotate_left_90(a); for(int i = 0; i<m; i++){ for(int j = 0; j < n; j++){ cout << a[i][j] << " "; } cout << '\n'; } return 0; }안녕하세요 큰돌님 덕분에 코테준비에 힘을 얻는중입니다. 다름이 아니라 c++교안을 쭉 정독하며 이해하려 하고 있는중에, 의문점이 생겨 질문드립니다. 위 코드는 교안에 있는 rotate_left_90()을 적용한 코드입니다.첫번째는, key.resize()에 대한 의문입니다. 구글링을 해보니 벡터는 '='로 대입하면 깊은복사가 일어난다고 합니다... 주석으로 없애고 실행해도... 깊은복사가 일어나는 것 같습니다... 그렇다면 지금 매개변수를 &key로 참조에 의한 호출로 받아 메인함수 벡터 a의 값을 변경중인데, 깊은복사가 일어나면 아예 새로운 벡터를 할당하는 것이니 형식만 맞다면 사이즈 조정을 할 필요 없지 않나요? 실제로 주석을 달아서 실행해도 값이 같게 나와서 사이즈 조정의 필요성과 제 지식이 맞는지 헷갈려 질문드립니다.두번째는, key[0].resize(n) 부분입니다. 사이즈 조정이 필요한 상황이라고 한다면 해당 코드는 key의 첫번째요소(벡터)만 사이즈 초기화를 해주고 있는 상황이 아닌가요?? 이렇게 된다면 나머지 요소(벡터)에 해당하는 길이들은 초기화 되지 않는게 아닌가요?? 출력에는 문제가 없어서... 저렇게 첫번째 요소의 길이만 수정해도 나머지 요소(벡터)들의 길이도 수정되는건지 궁금합니다 -> 아 이 부분은 해결했습니다...! 첫번째 요소가 벡터의 높이가 되는 느낌인거군요...?
-
해결됨MFC Windows 프로그래밍 - 기본
메모리 창을 어떡해 뛰우나요?
안녕하세요. 이제 막 강의를 듣고 있는데요. 디버거 창에서 메모리 보기 화면을 어떡해 하면 볼 수 있나요. 단축키를 좀 가르쳐 주세요.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-G 2294번 재귀 풀이 관련하여 질문드립니다.
제가 이해한 방식이 맞는지 확인받고자 질문드립니다! 혹시 이해에 잘못된 부분이 있다면 알려주시면 감사하겠습니다 ㅎㅎ우선 제 재귀 풀이는 다음과 같습니다. 풀이 1. 재귀 내부에서, 전체 코인에 대한 반복문을 돈다(vis배열 사용X)https://www.acmicpc.net/source/89158559풀이 2. 재귀 내부에서, 중복 조합을 뽑듯이 이전에 사용한 코인을 시작점으로 하여 코인에 대한 반복문을 돈다(vis배열 사용O)https://www.acmicpc.net/source/89531232 그리고 제가 헷갈렸던 부분과 그에 대해 스스로 이해한 내용은 다음과 같습니다! Q. 재귀로 풀 때에 dp의 상태값으로 sum이 충분한 이유A. sum은 어떤 코인을 사용하느냐에 따라 무작위로 호출되지만, 매개변수에 sum을 포함하며 함수를 매개변수가 k가 될 때까지 전진해나가며 그 sum에 대해 가능한 모든 작은 부분에 대한 재귀(제 코드 로직상 sum+1 부터 k 를 만드는 가능한 재귀)가 호출되기 때문에 다른 상태값이 아닌 sum 하나로 dp를 처리할 수 있는것이다.다만, dp의 개념 상 자신보다 작은 부분합에 대한 함수를 호출하는 것이 더 직관적으로 와닿기 때문에, 함수를 호출할때 매개변수를 0으로 호출하는 것 보다 k 로 호출하는 것이 논리와 잘 맞는다.( 현재 sum을 만들 때 필요한 최소 동전개수를 받아와서 sum에서 사용한다고 직관적인 이해 가능.https://www.acmicpc.net/source/89531844이 풀이처럼 풀이1 의 코드에서 함수 호출과 기저조건을 반대로 바꾼 것을 의미함) Q. vis배열을 사용하지 않는것과 사용하는 것이 둘 다 맞다고 통과되는 이유는?A. vis 배열을 사용하지 않으면 말그대로 중복 순열을 구하는 것 같이 보이지만 사실 개수가 아닌 sum을 기준(기저조건)으로 함수를 return해주고 있기때문에, 코인을 넣는 순서에 따라 (큰 코인을 먼저 사용하면 필요한 코인 개수가 더 줄어들 수 있음) 사실 조합의 관점으로 봐도 다른 조합이 만들어진다. (순서만 바뀐 같은 조합이 만들어지는 경우도 있긴 하다)vis 배열을 사용하면 위에서 "순서만 바뀐 같은 조합이 만들어지는 경우" 를 제외시키고 (ex.112 211과 같은 경우) 서로 다른 중복조합을 만드는 것이기 때문에 vis배열을 사용하지 않는 것 보다 조금 더 효율적이다.그치만 결과는 둘다 같게 나온다. 이렇게 2개의 질문에 대해 제가 이해한 내용이 맞을까요? 감사합니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2 - S, 맞왜틀
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. https://www.acmicpc.net/source/89525813
-
미해결[켠김에 출시까지] UE5 다크앤다커 스타일의 익스트랙션 RPG (D1)
Item#9 W_Inventory_PocketWorld가 열리지 않습니다
Item #8 강의를 보면 강의에서도 PocketWorld부분이 열리지 않은것처럼 보이던데Item #9에서는 작동하는것처럼 나오네요 캡쳐 방지때문에 올리지는 못하지만 Item#8 14:55에서W_Inventroy_PocketWorld관련해서 오류 발생한거처럼 보이는데 어떻게 해결하나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-C 인구이동 코드 질문입니다!
안녕하세요! 큰돌님!bfs로 visited 배열에 저장하는 값을 바꿔가면서 연합 체크 후 갱신하는 방법으로 풀이해보았습니다.주어진 테스트 케이스는 잘 나오는데 채점에서 계속 틀립니다.고민해보았지만 잘 해결되지 않아 질문 남깁니다!새해 복 많이 받으세요! :)https://www.acmicpc.net/source/89455017
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-H 시간초과 질문
http://boj.kr/e286a9db4cc4444a80c4d6731bb84466이 문제의 경우 4가지 단계로 나눠서 풀었습니다입력받을 숫자의갯수와 며칠 연속으로 받을지 정하는 수를 입력 받기입력 받을 숫자만큼 숫자 받기입력한 수가 3이라면 1~3, 2~4 이러한 방식으로 온도의 합 구하기내림차순으로 정렬 후 첫번째 요소 반환 (최댓값 반환) 위와 단계로 풀어보니 시간 초과가 발생했습니다. 어떻게 시간복잡도를 최적화 할지 감이 잘 안와서 질문 드립니다! 제가 최근에 알고리즘 공부를 시작해서 아직 시간복잡도 줄이기, 출력초과, 런타임에러 같은 오류에 익숙하지 않습니다. 이러한 오류를 검출하는 방법에는 어떤 것이 궁금합니다 그리고 실버 3까지는 풀 수 있는 문제가 많은데 실버 2로 올라가는 순간 도식화까지는 가능한데 이 도식화 한 것을 어떻게 코드로 표현해 풀 수 있는지 감이 안 잡히는 문제들이 많습니다. 이런 문제를 만나면 보통 정답 코드를 보는 편인데 큰돌님 강의 외에는 해설이 없다보니 어떻게 공부해야할지 잘 모르겠습니다ㅠㅠ 이 부분도 어떻게 공부하면 좋을까요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-K 질문드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.while 한번마다 이중반복문으로 bfs 시작점을 찾았기 때문에 시간초과가 난다고 생각했습니다. 그런데 어느정도로 시간이 걸리는지 특정하지 못하겠습니다. 이중반복문이어도 x가 있을 때 바로 go를 실행하니 O(NM)이라 할 수 있나요? 시간복잡도 측면에서 어떻게 되는지 자세하게 설명 부탁드립니다 ㅜㅜ #include <iostream> #include <vector> #include <queue> using namespace std; int N, M; vector<vector<char>> graph; vector<vector<bool>> visited; vector<pair<int, int>> ice; bool ok = false; int x1, y1, x2, y2; int cnt = 0; int dx[4] = {0, 0, -1, 1}; int dy[4] = {1, -1, 0, 0}; void reachable(int x, int y) { queue<pair<int, int>> q; vector<vector<bool>> check(N, vector<bool>(M, false)); check[x][y] = true; q.push({x, y}); while (!q.empty()) { auto [cx, cy] = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int nx = cx + dx[i]; int ny = cy + dy[i]; if (nx < 0 || nx >= N || ny < 0 || ny >= M) continue; if (check[nx][ny]) continue; if (graph[nx][ny] == 'L') { ok = true; return; // 다른 백조를 찾으면 즉시 반환 } if (graph[nx][ny] != 'X') { q.push({nx, ny}); check[nx][ny] = true; } } } } void go(int x, int y) { if (graph[x][y] == 'X') { ice.push_back({x, y}); return; } visited[x][y] = true; for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || nx >= N || ny < 0 || ny >= M) continue; if (visited[nx][ny]) continue; go(nx, ny); } } int main() { cin >> N >> M; graph.assign(N, vector<char>(M)); visited.assign(N, vector<bool>(M, false)); int l_count = 0; for (int i = 0; i < N; i++) { string s; cin >> s; for (int j = 0; j < M; j++) { graph[i][j] = s[j]; if (graph[i][j] == 'L') { if (l_count == 0) { x1 = i; y1 = j; l_count++; } else { x2 = i; y2 = j; } } } } int ret = 0; while (true) { reachable(x1, y1); if (ok) break; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (!visited[i][j] && graph[i][j] != 'X') { cnt++; go(i, j); } } } // 빙판 녹이기 for (const auto& pos : ice) { graph[pos.first][pos.second] = '.'; } ice.clear(); ret++; } cout << ret << endl; cout << cnt << endl; return 0; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K 질문있습니다.
안녕하세요. 제가 푼 풀이도 괜찮은 풀이인지 궁금하여 질문 드립니다.http://boj.kr/cbb841d4775441b4a884e1b8227627ee감사합니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
java로 포팅
큰돌님 C++강의를 수강하며 알고리즘 문제를 풀어나가고 있는데 언어를 java로 포팅하기로 해서 학습법 관련해서 질문하고 싶습니다!기존에 수강하며 풀었던 문제들을 Java로 다시 풀어보면서 복습겸 문법을 체화하고 강의 목록에 있는 문제들을 아이디어 위주로 참고하고 자바로 풀어나가며 학습하는 방법이 어떨지 궁금합니다. 다른 좋은 방법이 있다면 혹시 추천해주실 수 있을까요?감사합니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 이차원 배열 회전 질문드립니다.
교안 코드 중, resize()하는 코드가 있던데, 저의 코드는 resize()를 안해도 돌아가던데, resize()가 꼭 필요한가요?key = temp는 key 변수에다가 temp의 주소값을 할당하므로 resize()가 필요없다고 생각합니다. #include<bits/stdc++.h> using namespace std; typedef long long ll; vector<vector<int>> v = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; void left_90_rotate(vector<vector<int>> &key){ int n = key[0].size(); int m = key.size(); vector<vector<int>> temp(n, vector<int>(m,0)); for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ temp[i][j] = key[j][i]; } } key = temp; } void rotate_90_right(vector<vector<int>> &key) { int n = key[0].size(); int m = key.size(); vector<vector<int>> temp(n, vector<int>(m,0)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { temp[i][j] = key[m-j-1][i]; } } key = temp; } void print_v(){ for (vector<int> tv : v){ for (int i : tv){ cout << i << " "; } cout << "\n"; } cout << "--------------------\n"; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); print_v(); left_90_rotate(v); print_v(); rotate_90_right(v); print_v(); }
-
해결됨[켠김에 출시까지] UE5 다크앤다커 스타일의 익스트랙션 RPG (D1)
Item #12강의 이후의 결과물에 문제가 발생했습니다.
언제나 양질의 강의를 제공해주셔서 감사드립니다.이번 강의를 통해 Lyra를 언리얼 프로젝트에서 어떻게 사용하는지 알아보고언리얼 엔진과 관련한 디테일한 부분을 배워볼 수 있어 참 기쁩니다. Item #12강의에서 제공해주시는 애셋 파일을 프로젝트에 사용하기 위해이주하였으나 기존에 만들어둔 애니메이션 블루 프린트들과 연결되지 않는 문제가 발생하였습니다.또 이주된 애셋 파일들의 부모 클래스가 None으로 설정되어 결국 이주하지 않고 파일 경로상에 직접 옮기는 방식으로 수정하였습니다. 애셋과 관련된 문제는 발생하지 않았지만, 설정하고 수행한 결과가 Rookiss님의수행 결과와는 다르게 동작하는 문제가 발생하여 이렇게 글을 쓰게 되었습니다.발생하고 있는 문제의 동영상 링크는 다음과 같습니다.https://www.youtube.com/watch?v=ev40iYAin2E 이전 Item #8에서의 애셋을 이주하면 문제가 발생해서 동일하게 파일 경로에 옮겨 작업을 수행했는데,혹시 그 과정에서 문제가 발생해서 저런 문제가 발생하는 걸까요?문제가 어디서 발생하는지 알려주시면 감사하겠습니다.다시 한번 언제나 좋은 강의를 만들어주셔서 감사드립니다.
-
해결됨C++20 훑어보기
C++23은 어떻게 생각하시는지 궁금합니다.
루키스님 안녕하세요. 다른 질문들 보면 C++ 14 17은 좀 마이너 한것도 있고 해서 따로는 안 다룬다고 말씀하셨습니다. 인프런 기준 C++20을 다룬 곳이 루키스님이 유일한데,지금 25년이 된 시점에서 C++23은 어떻게 생각하시는지 궁금합니다.C++23정도면 메이저한 변화가 있는지? 아니면 마이너하다고 생각하시는지 그런게 있을까요?만약 메이저하다면 최신 C++에 관심있다는 것을 어필하기 위해 따로라도 공부하려고 합니다. 인프런 봇 답변도 환영합니다.미리 답변 감사합니다.