월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
더 풀어보면 좋은 문제 txt파일 한글이 다 깨집니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 모든 txt 파일이 한글이 깨져서 그러는데 어떻게 해야 하나요??
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문
그러니까 이거를 할 줄 알면 pair를 이용한 정렬법은 몰라도 되나요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문
그러니까 priority queue는 항상 top이 최대값이고, top 말고는 열람이 불가한건가요
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문있습니다.
밑에 코드와 같이 강의를 듣기 전에 먼저 코드를 작성해보았습니다. 선생님 강의 내용에서는 함수를 사용했지만 저는 함수 대신 다른 방법으로 짰는데 모두 wrong answer이 나오네요ㅠㅠ 계속해서 어디 부분이 틀렸는지 보지만 알고리즘은 맞는 듯해보이는데 혹시 어디서 오류가 발생했나요? #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; int main() { int n, m, tmp, cnt=0, mid = 0, start = 1, end; scanf("%d %d",&n,&m); vector <int> array(n); for (int i = 0; i < n; i++){ scanf("%d",&array[i]); end = end + array[i]; } while (start <= end){ int pl = 0; mid = (start + end) / 2; for (int i = 0; i < n; i++){ pl = pl + array[i]; if (pl > mid) { cnt++; pl = array[i]; } } if (cnt <= m) { end = mid - 1; tmp = mid; } else start = mid + 1; } printf("%d",tmp); return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
문제 해석에 대해
이게 다른 모든 회원이 친구 '이거나' 라는게 and의 의미로 해석해야 되는 건가요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
코드 리뷰 부탁드립니다.
#include <stdio.h> int main() { int S,N,i,j,tmp; scanf("%d %d",&S,&N); int mem[S]; mem[0] = 0; for(i = 0; i < N; i++){ scanf("%d",&tmp); if(mem[0] != 0){ for(j = i; j >= 0; j--){ if(tmp == mem[j]) mem[j] = mem[j-1]; else mem[j+1] = mem[j]; } } mem[0] = tmp; } for(i = 0; i < S; i++){ printf("%d",mem[i]); } return 0; } - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
냅색 알고리즘 식
식이 v[j] = max(v[j] //기존의 값 , (j/weight)*value +v[j%weight]); 이건 안되는 건가요? j/weight* value 로 weight가 몇개까지 들어갈수 있는지 확인하고 남은값을 v[j%weight]로 했는데 답이 틀리게 나와서 질문드립니다
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
문자열 처리
#include <stdio.h> #include <algorithm> #include <vector> using namespace std; int main(){ int n, sum=0, cnt=0; int startPoint=1, endPoint=0; vector< vector<int> > results; scanf("%d",&n); //연산부 while(startPoint<(n/2)+1){ for(int i=startPoint; i<n; i++){ sum = sum + i; endPoint = i; if(sum>n){ sum=0; startPoint++; break; } if(sum==n){ vector<int>result; //시작지점부터 끝지점까지 자연수 추가 for(int q=startPoint; q<=endPoint; q++){ if(q==endPoint) { result.push_back(endPoint); result.push_back(n); } else { result.push_back(q); } } results.push_back(result); sum=0; startPoint++; cnt++; break; } } } //출력부 for(int i=results.size()-1; i>=0; i--){ for(int q=0; q<results[i].size(); q++){ printf("%d",results[i][q]); if(q==results[i].size()-1){ break; } else if(q==results[i].size()-2){ printf(" = "); } else { printf(" + "); } } printf("\n"); } printf("%d",cnt); return 0; }
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
무방향 그래프로 해준 이유
이유가 있어서 무방향 그래프로 만든건지 궁금합니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
초기값 설정 문의
좋은 강의 감사합니다. 코드에 작은 오류가 있는게 아닌가 문의를 드립니다. 이중 for문으로 풀고 넘어갈뻔했는데 단일 for문이 정말 좋은 아이디어여서 꼼꼼히 공부해봤지만 확신이 없네요...... max의 초기값을 h[n-1]로 바꿔야 하지 않을까요? 마지막 앉은 사람은 분노유발자가 될 수 없으니..... 감사합니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
문제의 의도..
#include <stdio.h> #include <algorithm> #include <vector> using namespace std; void printMemory(vector<int> memory){ for(int idx=0; idx<memory.size(); idx++){ printf("%d ",memory[idx]); } printf("\n"); } int main(){ int s, workSize, memoryIdx = 0; int workIdx = 0, foundCnt = 0; int cnt=1; scanf("%d",&s); vector<int> memory(s); scanf("%d",&workSize); vector<int> work(workSize); for(int i=0; i<workSize; i++){ scanf("%d",&work[i]); } memory[0]=work[workIdx];//초기단계 workIdx++; //printMemory(memory); while(cnt!=workSize) { for(int i=0; i<s; i++) { if(cnt!=workSize) { if(memory[i] == work[workIdx]) { memoryIdx = i; foundCnt++; break; } } } if(foundCnt == 1) { //메모리내 work와 동일한게 있는 경우 if(cnt!=workSize) { for(int i=memoryIdx-1; i>=0; i--) { memory[i+1]=memory[i]; } memory[0]=work[workIdx]; workIdx++; cnt++; foundCnt=0; } } else { //메모리내 work와 동일한게 없는 경우 if(cnt!=workSize) { for(int i=memory.size()-1; i>0; i--) { memory[i]=memory[i-1]; } memory[0]= work[workIdx]; workIdx++; cnt++; } else { break; } } //printMemory(memory); } printMemory(memory); return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <iostream> int array[100]; int main() { int n, max = -214700000 , res = 0; scanf("%d",&n); for (int i = n; i > 0; i = i/10){ int num = i%10; array[num]++; } for (int i = 0; i < 10; i++){ if (max <= array[i]) { max = array[i]; res = i; } } printf("%d",res); 다음과 같이 작성했는데 제가 여러 숫자를 넣을 땐 오류가 발생하지 않는데 채점프로그램은 답이 틀렸다고 나오네요ㅠㅠ 혹시 선생님과 코드가 똑같아야 정답처리되나요 혹은 제 코드에 문제가 있는건가요? return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
9. 모두의 약수 관련 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <iostream> int main() { int array[50000]; int a; scanf("%d",&a); for (int i = 1; i <= a; i++){ for (int j = i; j <= a; j=j+i){ array[j]++; } } for (int i = 1; i <= a; i++) { printf("%d ",array[i]); } return 0; } 다음과 같이 코딩을 작성했는데 Time limited 오류가 발생합니다ㅠㅠ 어디가 문제인거죠?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
6. 가장 높은 탑 쌓기 질문
1강부터 쭉 들어왔지만 질문할만큼 막힌적이 없었는데... 이번에는 너무막혀.. 도움을 청해봅니다 ㅠㅠ 우선 강의 부분에서 가장 최대의 높이를 구하는 것을 해결할 수 있었습니다. 더 나아가 원 문제를 찾아보게 되었습니다. 원 문제를 질문하게 되어 먼저 죄송하다는 말씀 드리겠습니다... 원문제인 https://www.acmicpc.net/problem/2655 의 문제를 풀어보는데 너무 막히고 있습니다. 직접 구현한 코드는 다음과 같습니다. cache배열의 원소를 pair로묶어, first에는 높이를, second에는 직전 block의 번호를 저장 시켰습니다. 이를 활용하여 출력하는 코드를구현하였는데, 분명 주어진 예시는 통과가 되는데 어디서 반례가 있는건지.... 해결되지 않고있습니다 ㅠ.ㅠ 꼭좀 도와주시면 감사하겠습니다 ㅠ.ㅠ 1) 첫 vt.push_back(Block(0, 0, 0)) 은 prt함수에서 0이 되었을때 탈출되는데, 배열을 0부터 채워넣으면 마지막값을 출력 못하는 문제가 발생하여 dummy 값으로 0번 배열을 채워준 후, 1번 배열부터 사용하고, 정렬하였습니다. 2) cnt 배열같은 경우 각 배열마다 몇개의 block을 사용하였는지를 저장하였습니다. 이를 통하여 차후 prt 함수를 호출할 때, 가장 높은 놈을 인자로 넘겨 출력하도록 하였습니다. 3) prt 함수는 넘겨받은 인자를 시작으로, vt[num].second 값들을 확인하면서 자신의 아래 block의 index 번호를 알아내어 해당 인덱스를 출력하여 재귀를 타고 내려가는 함수입니다. index가 0이되면 return 하기때문에 이를 위해 앞에서 말했듯 dummy 값이 하나 맨아래층에 존재합니다. 4) main에서 cache배열의 출력은 디버깅 용 입니다. 답안을 백준에 제출할때는 제거후 제출했습니다. #include <bits/stdc++.h> using namespace std; // https://www.acmicpc.net/problem/2655 #define rep(i,k) for(i = 0; i < k; i++) #define REP(i,n,k) for(i = n; i < k; i++) class Block{ public: int bottom, height, weight; public: Block(int a, int b, int c) : bottom(a), height(b), weight(c) {}; bool operator < (const Block& tmp) const { if(bottom != tmp.bottom) return bottom > tmp.bottom; } }; vector<Block > vt; int cnt[102]; vector<pair<int, int> > cache(102); void prt(int num){ if (num != 0) { cout << num << "\n"; prt(cache[num].second); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); freopen("input.txt", "rt", stdin); int num, i; cin >> num; vt.push_back(Block(0, 0, 0)); REP(i, 1, num+1){ int b, h, w; cin >> b >> h >> w; vt.push_back(Block(b, h, w)); } sort(vt.begin()+1, vt.end()); cnt[1] = 1; cache[1].first = vt[1].height; cache[1].second = 0; for(i = 2; i <= num; i++){ int res(0), indexcnt(0); for(int j = i-1; j > 0; j--){ if(vt[j].weight > vt[i].weight && res < cache[j].first){ res = cache[j].first; indexcnt = j; } } cache[i].first = res+vt[i].height; cache[i].second = indexcnt; cnt[i] = cnt[indexcnt] + 1; } int maxcnt(-1); REP(i, 1, num+1){ if(maxcnt < cnt[i]) maxcnt = cnt[i]; } cout << maxcnt << "\n"; cout << "cache : "; REP(i, 1, num+1){ cout << cache[i].first << " "; } cout << "\n"; int maxh(0), idx(0); REP(i, 1, num+1){ if(maxh < cache[i].first) { maxh = cache[i].first; idx = i; } } prt(idx); return 0; } 꼭 저의 방식이 아니더라도 사용한 벽돌을 백트레킹 할수 있는 방법을 알려주시면 감사하겠습니다 ㅠ.ㅠ
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
문제 관련 질문드립니다
#include <iostream> #include <stdio.h> using namespace std; int main () { freopen("input.txt","rt",stdin); char a[100]; char c; gets(a); for (int i = 0; a[i] != '\0'; i++){ if (a[i] != ' '){ if (a[i] >= 65 && a[i] <= 90) { printf("%s",a[i] + 32); } else printf("%s",a[i]); } } return 0; } 다음과 같이 풀이과 다르게 작성했는데 어느 부분에서 오류가 발생했는지 모르겠습니다. 무엇이 문제인가요ㅠㅠ
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
선생님, 질문있습니다
선생님 안녕하세요. 강의 잘 보고있습니다. 저도 이번 문제를 앞서 질문하신 huniDev님처럼 벽을 세워 풀어봤습니다. 그런데 실행시키면 그냥 종료가 됩니다. 제가 수차례 봤지만 뭐가 문제인지도 모르겠습니다... 혹시 뭐가 문제일까요? int map[9][9] = { 1 }; int ch[9][9] = { 0 }; int cnt = 0; int dx[4] = { 1,0,-1,0 }; int dy[4] = { 0,1,0,-1 }; void D(int x, int y) { int xx, yy; if (x==7 && y==7) { cnt++; } else { for (int i = 0; i < 4; i++) { xx = x + dx[i]; yy= y + dy[i]; if (map[xx][yy] == 0 && ch[xx][yy] == 0) { ch[xx][yy] = 1; D(xx, yy); ch[xx][yy] = 0; } } } } int main() { for (int i = 1; i <= 7; i++) { for (int j = 1; j <= 7; j++) { scanf("%d", &map[i][j]); } } ch[1][1] = 1; D(1, 1); printf("%d", cnt); }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
선생님, 강의에있는 토마토문제를 3차원으로 변형한것을 풀어보았는데요, 차원이 하나 늘어났을 뿐인데 어디서 잘못된것인지 잘 모르겠어서 질문드립니다.
#include<iostream> #include<queue> #include<vector> #include<algorithm> using namespace std; struct Loc { int z; int x; int y; Loc(int a, int b, int c) { z = a; x = b; y = c; } }; int tom[103][103][103]; int dis[103][103][103]; int main() { queue<Loc> q; int m, n, h; cin >> m >> n >> h; int flag = 0; for (int i = 0;i < h;i++) { for (int j = 0;j < n;j++) { for (int k = 0;k < m;k++) { cin >> tom[i][j][k]; if (tom[i][j][k] == 1) q.push(Loc(i, j, k)); } } } int dx[6] = { 1,-1,0,0,0,0 }; int dy[6] = { 0,0,1,-1,0,0 }; int dz[6] = { 0,0,0,0,1,-1 }; while (!q.empty()) { Loc tmp = q.front(); q.pop(); for (int i = 0;i < 6;i++) { int xx = tmp.x + dx[i]; int yy = tmp.y + dy[i]; int zz = tmp.z + dz[i]; if (tom[zz][xx][yy] == 0 && xx >= 0 && xx < n && yy >= 0 && yy < m && zz >= 0 && zz < h) { tom[zz][xx][yy] = 1; dis[zz][xx][yy] = dis[tmp.z][tmp.x][tmp.y] + 1; q.push(Loc(zz, xx, yy)); } } } int max = 0; for (int i = 0;i < h;i++) { for (int j = 0;j < n;j++) { for (int k = 0;k < m;k++) { if (tom[i][j][j] == 0) { cout << -1;return 0; } } } } for (int i = 0;i < h;i++) { for (int j = 0;j < n;j++) { for (int k = 0;k < m;k++) { if (dis[i][j][j] > max)max = dis[i][j][k]; } } } cout << max; return 0; } 먼저 좋은 강의를 제공해주셔서 정말 감사하다는 말씀 드리고 싶습니다. 너무너무 큰 도움을 받고 있습니다.그리고 강의에 없는 문제를 질문드려서 정말 죄송합니다.ㅜㅜ 이 문제는 강의에 있는 토마토문제에서 한 차원 늘렸을 뿐이고, 그래서 구조체에 z변수를 추가해서 똑같이 풀어보았는데요. 아무리 봐도 맞는 코드인것같고, 백준에 있는 테스트케이스를 넣어봐도 잘 나오는데 틀렸다고만 나오니 답답하네요 2차원과 똑같이 코드를 구성하면 안되는이유가 있는것일까요..?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
DFS의 당위성 관련 질의
안녕하세요 선생님! 강의를 잘 수강하고 있는 학생입니다. 저는 선생님 강의에서 DFS가 실제로 사용되는 것을 처음 배웠는데요! DFS의 개념도 알려주신 대로 잘 이해해보고 있습니다! 그런데 위 문제에 왜 DFS를 적용해야만 하는지 그 당위성에 대한 답변을 들을 수 있을까요? 예를 들어, 이 문제에서 요구하는 핵심은 이것이고, 이는 이러한 특징을 갖고 있다. 그래서 DFS를 써야만 한다, 하는 식으로요. 저는 이 문제에선 해당 숫자가 부분집합에 들어가느냐, 안들어가느냐 2가지 선택지가 핵심이므로 두 선택지가 주어지는 이진트리를 사용할 수 있다고 생각했고, 문제에서 전위 순회를 하라했으니 DFS 를 전위순회로 진행하면 되겠다고 유추했습니다! 보다 깊은 선생님의 이야기를 듣고싶습니다. 다음에 어떤 문제를 만났을 때, 그 문제를 해석해서 DFS와 연결시킬 수 있는 힘을 기르는 데 도움이 되지 않을까 하여 질의드립니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
이러한 문제에 도달했을때 즉시 종료할수있다면 하는것이 좋을까요?
#include <stdio.h> #include <algorithm> using namespace std; int n, i, arr[11], total=0; bool flag = false; void DFS(int level, int sum){ if(sum > total/2){ return; } if(level == n+1){ if(sum == (total-sum)){ flag = true; return; } } else { DFS(level+1, sum+arr[level]); DFS(level+1, sum); } } int main(){ //freopen("input.txt", "rt", stdin); scanf("%d", &n); for(i=1; i<=n; i++){ scanf("%d", &arr[i]); total += arr[i]; } if(total%2 == 1){ printf("NO"); return 0; } DFS(1, 0); if(flag){ printf("YES"); } else { printf("NO"); } return 0; } 선생님 말씀대로 코드를 짰는데요 우선 total%2 == 1 (홀수)이면 즉시 종료하는것으로 하는건 좋은 답일까요 안좋은 답일까요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
else 문에서의 for문과 차이점
dfs 함수의 else 문을 for(int i =0; i<pizza.size(); i++) { ch[L] = i; DFS(L+1,s+1); } 이렇게 짰었습니다. 그런데 돌려보니 time limit이 뜨더군요. 하지만 선생님 파일 코드 대로 ch[L] = s; DFS(L+1,s+1); DFS(L,s+1); 이렇게 바꾸었더니 타임리미트가 사라지더군요. 두 코드다 피자집의 갯수만큼 같은 레벨의 노드가 생기고 같은 형태로 내려가지 않나요? 어째서 두식의 속도차이가 나는지 궁금해서 질문을 드립니다/