월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결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); 이렇게 바꾸었더니 타임리미트가 사라지더군요. 두 코드다 피자집의 갯수만큼 같은 레벨의 노드가 생기고 같은 형태로 내려가지 않나요? 어째서 두식의 속도차이가 나는지 궁금해서 질문을 드립니다/
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
혼자 풀어봤는데 궁금합니다
#include <stdio.h> int arr[10][10], ch[10][10], cnt=0; void DFS(int v1, int v2) { int i, j; if (v1 == 7 && v2 == 7) { cnt++; } else { for (i = v1-1; i <= v1+1; i++) { for (j = v2-1; j <= v2+1; j++) { if (i < 1 || i > 7 || j < 1 || j> 7) continue; if (arr[i][j] == 0 && ch[i][j] == 0) { ch[i][j] = 1; DFS(i, j); ch[i][j] = 0; } } } } } int main() { int i, j; for (i = 1; i <= 7; i++) { for (j = 1; j <= 7; j++) { scanf("%d", &arr[i][j]); } } ch[1][1] = 1; DFS(1,1); printf("%d\n", cnt); return 0; } 혼자 풀어봤는데 답이 잘 안나와서 여쭤봅니다. 이중 for문에서 continue를 사용해서 문제가 된걸까요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
왜 for문 안에서 매번 i를 선언하면 결과가 다른가요?
지금까지 for(int i=0; i<n; i++) 이런 식으로 for문 안에서 i를 선언하는 스타일로 코딩을 해왔는데, 선생님께서 알려주신 코드로 모든 for문에서 i를 선언하는 방식으로 컴파일을 해보면 1초가 넘는 시간이 걸리고 아무것도 출력되지 않는데, 꼭 i를 지역변수로 선언해야만 하는 이유가 있을까요? 그리고 for문에서 i를 선언하는 스타일과 지역변수로 미리 선언하는 스타일의 걸리는 시간 차이가 큰지도 궁금합니다
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
플로이드 워셜 알고리즘을 사용하여 경로를 얻을 수 있다고 하셨는데요..!!
혹시 코드도 올려주실 수 있나요? 혼자 나름대로 짜보려고 하는데 복잡해서 헷갈리네요 ㅠㅠ
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
78 79 번 알고리즘 관련해서 질문입니다.
어떤 알고리즘인지는 이해가 가는데 문제를 봤을 때, 문제들이 이 알고리즘을 사용해라는 식으로 출제가 되는건가요? 장단점에 대해서 잘 판단이 안가는데 이런 문제를 봤을때 어떤 알고리즘을 사용해야할지에 대한 판단 기준이 무엇인가요? 예를 들어 무엇이 더 효율적이다나... 이 알고리즘이 더 효율적이다라는 생각할 수 있어야하지 않나요? 그렇게까지는 생각이 안되서 ..
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
테스트 케이스 확인 부탁드립니다^^
테스트 케이스에 여는 괄호가 더 많을 때에 대해서는 고려가 안되어 있는 것 같아요! 물론 강사님께서 짜신 코드대로 하면 문제가 없지만, 제가 미리 풀어봤을 때 닫는 괄호가 더 많아지면 NO를 출력하도록 해놓았는데, 여는 괄호가 더 많았을때는 고려하지 않고 코드를 짰는데, 모든 케이스를 통과했습니다. 예를 들어 (((( 로 테스트 케이스가 들어오는 경우가 추가 되어야 할 것 같네요!!^^
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
2차원 배열 초기화 질문입니다
안녕하세요 선생님 강의 잘 듣고 있습니다! 다름이 아니라 위 사진과 같이 scanf("%d", &n); int a[n+2][n+2] = {0,}; 2차원 배열을 초기화 하고 나서 컴파일 하니까, 첨부한 사진과 같은 Warning 메세지가 뜨면서 실행 시에는 입력을 하다 말기까지 하더라구요 ( * n=5로 입력 받을 경우, 원래는 25개의 숫자가 입력받아져야 하는데 6번만 입력받더라구요 ㅜㅜ) ( * 2차원 벡터로 바꿨을 때는 정상적으로 작동했습니다) 그동안 1차원 배열로 n을 입력받고 나서 int a[n] = {0,}; 이런 식으로는 잘 초기화 되고 할당이 되었는데, 2차원 배열의 경우는 이게 안되는 이유가 무엇인가요? (*동적 할당..? 과 관련있는 것인가요?) 위 사진과 같은 오류 메세지는 어떨 때 생기는 오류메세지일까요? ㅜㅜ ( * [Warning] array of array of runtime bound 라고 써져 있는 부분이요,,) * 아래는 코드 전문입니다. #include <stdio.h> #include <vector> using namespace std; int main(){ int n, bongwoori=0; scanf("%d", &n); // vector<vector<int>> a(n+2, vector<int>(n+2, 0)); int a[n+2][n+2] = {0,}; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ scanf("%d", &a[i][j]); } } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j] && a[i][j]>a[i][j-1] && a[i][j]>a[i][j+1]){ bongwoori++; } } } printf("%d", bongwoori); return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
안녕하세요 강사님! 문제 조건에 대한 질문이 있습니다.
'각 벽돌은 입력되는 순서대로 1부터 연속적인 번호를 가진다' 라는 문제 조건이 가지는 의미가 무엇인가요? 저는 앞쪽에서 입력받은 것부터 탑의 밑에 넣어야 한다는 생각이 들었습니다. 그런데 강사님의 풀이를 보면 넓이로 내림차순 정렬하셨는데 입력받은 벽돌들의 순서가 바뀌어도 상관없는건가요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
조금 다른 풀이방식
합의 결과만 출력하면 되는 문제이기 때문에 2차원 배열을 만들필요는 없다 생각했습니다. 2차원 배열을 만들지 않고도 푸는 풀이를 다른분들에게도 공유해볼까 합니다!! #include <bits/stdc++.h> using namespace std; #define rep(i,k) for(i = 0; i < k; i++) #define REP(i,n,k) for(i = n; i < k; i++) int main() { ios_base::sync_with_stdio(0); cin.tie(0); //freopen("input.txt", "rt", stdin); int num, i, j; cin >> num; vector<int> a(num); vector<int> b(num); rep(i,num) cin >> a[i]; rep(i,num) cin >> b[i]; int sum(0); for(i = num-1; i > -1; i--){ for(j = 0; j < num; j++){ sum += (a[i] < b[j]) ? a[i] : b[j]; } } cout << sum; return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
27번 문제 강의 2분47초질문좀드리고싶습니당
체크 배열에서 0이 아니면 그대로 다 출력하면 된다고 말씀하셧는데, 배열값이 0이 아닌 인덱스는 모두 소수로 간주할 수 있는건가요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
28번 라인의 if(Count(mid, x)>=m에 대한 부분 질문이 있습니다.
해당 부분 if(Count(mid, x) ==m으로 해도 문제 없을 까요?? 궁금합니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
거리배열을 따로 만드는 경우 타임리밋
안녕하세요. 수업 잘 듣고 있습니다. 체크배열에 정점까지 도달하는 데 필요한 횟수를 저장하는 게 헷갈려서, dis배열을 따로 만들어봤습니다. 그랬더니 타임리밋이 걸리더라고요. 제가 보기엔 연산 속도에 큰 차이가 날 것 같지 않은데, 이렇게 배열 두 개를 사용할 경우 타임리밋이 걸리는 이유가 궁금합니다. #include <stdio.h> #include <vector> #include <queue> #include <algorithm> using namespace std; int ch[10001], dis[10001], d[3]={1, -1, 5}; int main(void){ //freopen("input.txt", "rt", stdin); int i, n, m, x, pos; queue<int> Q; scanf("%d %d", &n, &m); ch[n] = 1; Q.push(n); while(!Q.empty()){ x = Q.front(); Q.pop(); for(i=0; i<3; i++){ pos = x+d[i]; if(pos<= 0 || pos>10000) continue; if(ch[pos]==0){ dis[pos] = dis[x] + 1; Q.push(pos); } if(pos==m){ printf("%d", dis[pos]); exit(0); } } } return 0; }
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문있습니다!
안녕하세요. 한가지 궁금한 점이 있습니다. #include <string> 에 있는 문자열을 정수로 바꾸어 주는 stoi()와 문자열 개수를 반환하는 strlen()을 이용해서 풀었는데 강사님처럼 이렇게 푸는게 좋을지 아니면 함수를 이용해서 푸는 것이좋을지 잘 모르겠습니다. 알고리즘 공부를 위해서는 함수를 이용한 것보단 강사님께서 푸시는 스타일로 문제를 푸는게 맞는 걸까요??
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
시간복잡도 개선 질문드립니다.
삭제된 글입니다
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
타임리밋 오류가 발생하는데 코드 한번만 봐주실 수 있을까요?
#include <algorithm> #include <functional> #include <stdio.h> using namespace std; int main(){ int n, a[101], cnt=0, result; scanf("%d", &n); for(int i=0; i<n; i++){ scanf("%d", &a[i]); } sort(a, a+n, greater<>()); for(int i=1; i<n; i++){ int pre = a[i-1]; int now = a[i]; if(pre!=now){ cnt++; } if(cnt == 2){ printf("%d",now); exit(0); } } return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
4번 나이차이 구하기 문제 질문
파일처리에 관해서 전혀 몰라서 여쭤봅니다. freopen 함수에서 모드는 "rt"로 하셨는데요. "r"의 기본이 테스트 모드가 맞나요? 그러므로 이문제에서 "rt"를 쓰나 "r"을 쓰나 결과는 같은거죠? 바이너리 파일을 다룰 때 "rb", "wb"로 명확하게 지정해주는 것이 필요하다면 기본적인 텍스트 파일에서는 "rt" / "r", "wt", "w" 크게 구분없이 이용해도 되는건가요?