월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문이 있습니다
강의 보기전에 최대한 고민해보고 풀어보라고하셔서 고민을 하는데 해결능력이 많이 부족한지 잘 떠오르지않아서 그냥 이런식으로 좀 어거지로 코드를 짰는데 채점을 돌리니 다 맞긴 맞았습니다.. 이런 방법도 맞다고 할수있나요?? #include<stdio.h> using namespace std; char a[100]; char b[100]; int main(){ //freopen("input.txt", "rt", stdin); int i,temp=0, cnt=0, temp1=0, cnt1=0; scanf("%s",&a); scanf("%s",&b); for(i=0; a[i]!='\0'; i++) { temp=temp+ a[i]; cnt++; } for(i=0; b[i]!='\0'; i++) { temp1=temp1+ b[i]; cnt1++; } if(cnt==cnt1&&temp==temp1) printf("YES"); else printf("NO"); return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
DFS,BFS와 동적알고리즘 차이
안녕하세요 강의를 듣다가 궁금한게 있어서 질문드립니다. 최단경로는 Bfs 문제로 풀었던 기억이있는데 dp로도 풀수 있는것을 보고 dp와 bfs중 어떤상황에 맞게 쓰는게 좋을지 궁금하여 질문올립니다.
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
46번 문제 질문 있습니다!
안녕하세요 46번 다시 풀다가 5번째 2000개 데이터 input에서 틀려서 궁금해서 질문합니다. K초 작업이 끝나고 -> 다음 index인 값이 0이면 0이 아닌 값을 만날때까지 ++한다음에 답을 출력 하게 짰는데요!(영상에서 설명하신 거처럼)근데 왜 계속 마지막에서 598이라는 답이 나오는 지 궁금합니다. (559가 정답입니다!)제가 놓치고 있는 부분이 있을 까요? #include <string> #include <vector> #include <iostream> #include <algorithm> using namespace std; int a[2001]; int main() { int N, K, total = 0; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &a[i]); total += a[i]; } scanf("%d", &K); if (total <= K) { printf("-1"); exit(0); } int index = 0; while (K--) { if (index == N) index = 0; if(a[index] !=0 )a[index]--; else { while (a[index] == 0) { if (index == N) index = 0; index++; } a[index]--; } index++; } if (a[index] == 0) { while (a[index] == 0) { if (index == N) index = 0; index++; } } printf("%d\n", index+1); return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
37번 LRU문제 for문 값 관련
//miss if(pos==-1){ for(j=j-1; j>=1; j--){ c[j]=c[j-1]; } } 안녕하세요! 2중 for문 내의 miss부분을 처리하는 과정에서 저는 j = s-1이라 하지 않고 j = j-1이라고 입력했는데도 채점폴더에서 100점이 나왔는데 저처럼 해도 괜찮은건가요..? 왜 되는지 의문입니다 ㅠㅠ
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
top down 과 bottom up차이
문제를 풀다가 질문드립니다 top down과 bottom up은 단순히 문제를 푸는 방법의차이인가요? 아니면 상황에 맞게 더 유리한 문제가 있을 수 있나요? DFS나 BFS처럼 더 유리하게 푸는 방법의 차이인가요??
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
65번 질문
안녕하세요. 65번 문제 푸는 중 궁금점이 생겨 문의 드립니다. 65번 문제 푸는데 계속 답이 2가 나와서 봤더니 저는 다음 탐색할 좌표인 xx와 yy를 전역변수로 선언해서 계속 2가 나왔습니다. xx와 yy를 DFS함수내의 지역변수로 선언해야만 올바른 답이 나오더라구요. 그런데 계속 생각 해봐도 왜 xx와 yy를 전역변수로 선언하면 올바른 답이 안나오는지 궁금합니다. 감사합니다.
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
선생님, 3중 for 문으로 만든 것 같은데 TimeLimit 에 걸립니다.
문제를 처음 보자마자 4중 for문을 생각했지만, 4중 for 문은 large 에 쓰이지 못 할 것 같아서 조금 고민해서 나름 3중for 문으로 만들었다고 생각했는데 3번 case 까지는 success 이지만 4번부터 Time Limit 이 걸립니다. 충분히 고민했다고 생각하지만 원인을 못 찾겠어서 질문 올립니다 ㅠㅠ #include <iostream> #include <vector> #include <algorithm> #include <cstdlib> using namespace std; // global variable int territory[5][50]; // function // main int main(int argc, char** argv) { // input int i, j ,k; int h, w, my_h, my_w, sum = 0, pos_h, pos_w, max = -2147000000; scanf("%d %d", &h, &w); for (i = 0; i < h; i++) for (j = 0; j < w; j++) scanf("%d", &territory[i][j]); scanf("%d %d", &my_h, &my_w); // algorithm for (i = 0; i <= h - my_h; i++) { sum = 0; // 처음 내 영역의 sum 을 구한다. for (pos_h = i; pos_h < i + my_h; pos_h++) { for (pos_w = 0; pos_w < my_w; pos_w++) { sum += territory[pos_h][pos_w]; } } if (max < sum) max = sum; // 한칸씩 오른쪽으로 이동해가면서 합을 구한다. for (j = 0; j <= w - my_w; j++) { for (pos_h = i; pos_h < i + my_h; pos_h++) { // 왼쪽을 뺀다. sum -= territory[pos_h][j]; // 오른쪽을 더한다. sum += territory[pos_h][j+my_w]; } if (max < sum) max = sum; } } // print(needed) printf("%d", max); // exit return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
문제 이해가 가지 않는 부분이있습니다.
거리가 가까운 토끼가 많다면, 가장 위에 있는 토끼, 그러한 토끼가 여러 마리라면, 가장 왼쪽에 있는 토끼를 먹는다. 상하좌우로 토끼가 가까운거리에 두마리 이상이면 위로가는건 알겠는데 그러한 토끼가 여러 마리라면, 가장 왼쪽에 있는 토끼를 먹는다. 이부분이 이해가 가지않습니다. 위의 행에 여러마리가있으면 위왼쪽을 먹는다는게 맞는건지... 이때 위 왼쪽을 먹는거면 위는 무시하고 위왼쪽부터 먹는건지 그러면 위왼쪽에 토끼 가 없는경우는 어떻게하는건지... 여러마리의기준이 위의 행을 다채우고있는건지 아니면 두마리 이상부터인건지... 저부분이 정확히 이해가 가지않아서 어떻게 설명을 해야할지도 좀 난감하네요...
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
시간초과가 나는 이유가 궁금합니다!
아래와 같은 코드로 하니 하나 뺴고 시간초과가 되어서 궁금합니다. 강의랑 비슷한 코드인데 왜 제 코드는 시간초과일까요?! #include <iostream> #include <string> #include <vector> #include <algorithm> #include <queue> using namespace std; int N, M; vector<pair<int, int> > pizza; vector<pair<int, int> > people; int ch[13]; int res = 987654321; int cal(int x1, int y1, int x2, int y2) { return abs(x1 - x2) + abs(y1 - y2); } void dfs(int index, int cnt) { if (cnt == M) { int min = 0; for (int i = 0; i < people.size(); i++) { int dis = 987654321; for (int j = 0; j <M; j++) { int x = cal(people[i].first, people[i].second, pizza[ch[j]].first, pizza[ch[j]].second); if(dis > x) dis = x; } min += dis; } if (min < res) res = min; return; } for (int i = index; i < pizza.size(); i++) { ch[cnt] = i; dfs(index + 1, cnt+1); } } int main() { scanf("%d %d", &N, &M); for (int i = 1; i <=N; i++) { for (int j = 1; j <= N; j++) { int x; scanf("%d", &x); if (x == 1) people.push_back({ i,j }); else if (x == 2) pizza.push_back({ i,j }); } } dfs(0, 0); printf("%d\n", res); return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
41번 연속된 자연수의 합 ) 질문드립니다.
우선 소스코드는 위와 같은데요 제가 생각한 방법은 n이라는 수가 주어졌을때 1부터 n/2까지 반복문을 돌리면서 , 1+ 2+3+ .... 2+ 3+ 4+ ... 3+ 4+ 5+ ..... 4+ 5+ ...... 5+ 6+... . 6+7+.... 7+8.... 이중 합이 15가 나오는경우만 count하는 방법을 생각해봤는데 이 방법으로도 가능할것 같은데 계속 고민해가며 고쳐봐도 틀리게 나와 질문드립니다. #include <stdio.h> int temp[100],cnt=0; void Clear(int temp[],int p){ for(int i=0; i<=p; i++){ temp[i]=0; } } int main(void){ int n,sum=0,p=1,i,j; scanf("%d",&n); for(i=1; i<n/2; i++){ int k=i; while(1){ if(sum==n){ cnt++; for(j=1; j<p; j++){ if(j==p-1){ printf("%d = %d\n",temp[j],n); } else{ printf("%d + ",temp[j]); } } Clear(temp,p); p=1; sum=0; } else if(sum>n){ Clear(temp,p); p=1; sum=0; break; } sum+=k; temp[p++]=k++; } } printf("%d",cnt); }
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
선생님 c++ 라이브러리? 를 사용하는것에 큰 문제가 없나요?
코딩 테스트나 코딩 대회에서는 시간 복잡도와 공간 복잡도까지 고려해야한다고 알고 있습니다. 이 문제를 저는 vector 라이브러리를 활용해서 (erase, pop_back, insert 등) 풀었습니다. 이 라이브러리를 활용하는 것이 코딩 테스트나 대회에서 불리하게 작용하나요? 비슷한 느낌으로 scanf, printf 말고 cin, cout 을 쓰는것도 살짝 느리다고 알고 있습니다. 이런 이유에서 선생님께서는 scanf, printf 를 사용하시는건가요? #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int s, n, idx = 0, i, tmp; bool isValue = false; scanf("%d %d", &s, &n); vector<int> cache(s); for (i = 0; i < n; i++) { isValue = false; scanf("%d", &tmp); for (int j = 0; j < cache.size(); j++) { if (tmp == cache[j]) { isValue = true; idx = j; } } if (!isValue) { cache.insert(cache.begin(), tmp); if (cache.size() > s) cache.pop_back(); } else { cache.erase(cache.begin() + idx); cache.insert(cache.begin(), tmp); } } for (unsigned i = 0; i < cache.size(); i++) cout << cache[i] << ' '; cout << endl; return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
BFs
그래프 상의 최단거리의 경우 전에 BFS문제를 사용했던 걸로 알고있습니다. 다익스트라도 최단거리 관련문제인데 다익스트라는 BFS의 한종류의 알고리즘으로 보면되나요? BFS와 다익스트라의 차이점이 있다면 궁금합니다
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
선생님, 질문있습니다.
선생님, 안녕하세요? 저는 선생님의 가르침처럼 a가 들어오면 캐시에 있는 작업번호들과 하나하나 비교해보는 것이 아닌 함수를 하나 만들어서 현재 들어온 a에 대하여(제 코드 상에서는 income에 해당합니다) 캐시 전체를 일괄 탐색한 다음 만일 캐시 안에 a가 있다면 그에 맞는 작업을 진행하고 없다면 맨 앞에서부터 밀어내는 방식으로 코드를 만들어봤습니다. 이러한 방식도 그럴듯한 답이 될 수 있는가 궁금합니다. 항상 강의 감사드립니다. #include<stdio.h> #include<stdlib.h> #include<time.h> int S; // 저장용량 int N; // 작업개수 bool isincache(int* cache, int income) { int income_ = income; for (int i = 0; i < S; i++) { if (income_ == cache[i]) { return true; break; } } return false; } int main() { srand(time(NULL)); scanf("%d", &S); scanf("%d", &N); int* cache = (int*)malloc(sizeof(int) * S); int* work_list = (int*)malloc(sizeof(int) * N); int income = 0; int index = 0; int current_cache_capacity = 0; for (int i = 0; i < N; i++) { work_list[i] = (rand() % 100) + 1; } //임의의 작업 번호를 다 집어넣음 printf("현재 작업번호 리스트 : "); for (int i = 0; i < N; i++) { printf("%d ", work_list[i]); } printf("\n"); int count1 = 0; //애초에 빈 상태이니까 채우도록 하겠습니다. while (S - current_cache_capacity >= 0) { cache[S - current_cache_capacity] = work_list[count1++]; current_cache_capacity++; } //이렇게 되면 current_cache_capacity == S가 되어서, 캐시는 모두 차있는 상태 for (int i = 0; i < N; i++) { income = work_list[i]; // income으로 for문이 돌때마다 초기화를 합니다. //income이 work_list 안에 있는가? 없는가?를 분기로 하여 알고리즘 작성 if (isincache(cache, income)) { int index = i; int before = i - 1; while (before >= 0) { cache[before + 1] = cache[before]; before--; } cache[before + 1] = income; } else { for (int i = S-1; i > 0; i--) { cache[i] = cache[i - 1]; } cache[0] = income; } } for (int i = 0; i < S; i++) { printf("%d ", cache[i]); } }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
문제푸는방법에대해서
안녕하세요 75번을 풀다가 궁금한게 생겨서 질문 올립니다. 처음이문제를 봤을때 저는 vector<pair<int,int> v 를 써서 money와 when을 묶어주려고했는데 구조체를 쓰는이유가있을까요? pair를 썼을때 보다 장점이있을까요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
visual studio에서는
vs에서도 bits/stdc++.h를 넣으면 되나요? vs는 없는거같은데 업그레이드를 시켜야하나요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
36번 다소 헷갈려서 질문을 드립니다.
for(j = i-1; j>=0; j--){ // 1 if(a[j]>tmp) a[j+1] = a[j]; else break; } a[j+1]=tmp; // 2 처음 for문이 시행될 때에 j는 i가 1이기 때문에, j는 0으로 초기화가 된 상태에서 for문 안에 있는 일련의 if문을 거치고 난 뒤에 j--에 의해 j가 -1로 바뀐 상황에서, 이미 j>=0이라는 컨디션에 해당안하기에 바로 a[0]=tmp; 가 된다고 이해하였습니다. 이게 다른건 몰라도 삽입은 할 때마다 이상하게 상기 ㅈ주석으로 표시한 2코드의 의미가 이해가 안된다기보다는 오히려 확 와닿지를 않는다고 표현하는게 더 적절하네요ㅜㅜㅜ 그렇다면 for문 대신 while(j>=0&&a[j]>tmp){ if(a[j]>tmp){a[j+1] = a[j];} else break; j--; } a[j+1]=tmp; } 라고 표현해도 괜찮을까요? 늘 감사드립니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
35번 궁금합니다.
선생님, 선생님의 코드에 비해 저의 코드에 어떠한 불필요한 과정이 있는지 알려주시면 대단히 감사하겠씁니다. 많이 까주세요. 감사합니다. #include<iostream> #include<vector> using namespace std; void swap(int* a, int* b) { int tmp; tmp = *a; *a = *b; *b = tmp; } int main() { int N; int negative = 0; //입력받은 음수의 개수 int start = 0; //음수가 맨 앞으로 도달하면 그 다음으로 인덱스를 설정 int positive = 0; //양수의 시발점을 표현하기 위한 인덱스 cin >> N; vector<int>index(N); vector<int>arr(N); for (int i = 0; i < N; i++) { index[i] = i; } for (int i = 0; i < N; i++) { cin >> arr[i]; if (arr[i] < 0) { negative++; } } for (int i = 0; i < N; i++) { if (start == negative) { break; } if (arr[i] < 0) { swap(&arr[start], &arr[i]); swap(&index[start], &index[i]); start++; } } for (int i = 0; i < N; i++) { if (arr[i] < 0) { positive++; } } for (int i = positive; i < N; i++) { int min = index[i]; for (int j = i + 1; j < N; j++) { if (min > index[j]) { swap(&index[i], &index[j]); swap(&arr[i], &arr[j]); } } } for (int i = 0; i < N; i++) { printf("%d ", arr[i]); } }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문있습니다.
좀 이상한 질문이긴한데... check함수를 미로찾기에서는 2차원배열로 쓰고 경로탐색에서는 1차원배열로 쓰셨는데...이게 1차원으로 해야하는지 2차원으로 해야하는지 어떻게 알수 있는방법이있을까요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
인접리스트
안녕하세요인접배열로도 문제를 푸는데 지장없다고 하셨는데 그러면 인접리스트를 썻을때의 장점이나 문제를 풀때 써야하는경우가 생길까요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
46번 질문입니다.
#include <iostream> #include <vector> #include <algorithm> using namespace std; int p[2001]; int main(){ freopen("input.txt","rt",stdin); int n,k,pos=0,bp=0,tot=0; // vector<int> p(n+1); cin>>n; for(int i=1;i<=n;i++) { cin>>p[i]; tot+=p[i]; } if(k>=tot) { printf("-1\n"); return 0; } cin>>k; while(1){ pos++; if(pos>n) pos=1; if(p[pos]==0) continue; p[pos]--; bp++; if(bp==k) break; } while(1){ pos++; if(pos>n) pos=1; if(p[pos]!=0) break; } cout<< pos; return 0; } 위 코드에서 주석해놓은 벡터배열로 선언해서 실행하면 타임리밋이고 int 배열로 선언하면 잘 되는데 왜 그런건가요? 처음에 벡터로 풀었는데 당황스러웠어요