월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
39.번에는 p1,p2,p3를 1로 초기화하셧는데
40번에는 p1,p2,p3를 0으로 초기화한 이유는 sort(a.begin(),a.end()) 때문인가요??
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
age 초기화를 위에서 하면 왜 올바른 값이 나오지않는거죠?
#include<iostream> using namespace std; int main() { char a[20]; cin>>a; int year,age; age=2021-year; if(a[7]=='1' || a[7]=='2'){ year=1900+((a[0]-'0')*10)+(a[1]-'0'); if(a[7]=='1'){ cout<<age << " M"; } else if(a[7]=='2'){ cout<<age << " W"; } } if(a[7]=='3' || a[7]=='4'){ year=2000+((a[0]-'0')*10)+(a[1]-'0'); if(a[7]=='3'){ cout<<age <<" M"; } else if(a[7]=='4'){ cout<<age <<" W"; } } return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
pair<int, int> 와 직접 만든 구조체의 차이가 있나요?
구조체를 직접 만드셔서 큐에 넣으셨는데 저는 구조체를 만들지않고 pair형을 넣었는데 구조체를 직접 만들어서 넣으면 메모리나 성능에 대한 부분이 차이가 있나요? 그리고 for문을 사용하실 때 i 를 for문 밖에서 먼저 선언후 사용하시는데 for문 밖에서 i 를 사용할 일이 없다면 for(int i=0; i > 10; i++) 이런식으로 사용하면 for 문이 끝날때 i 가 할당해제되어서 상관없을것같은데 이런식으로 사용하면 크게 메모리나 성능에 이슈가 있을까요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
dx와 dy 배열 순서에 관해 질문이 있습니다!
dx와 dy안에 배열 순서를 {int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 }; 이런식으로 바꿨는데 왜 답도 같이 바뀌는 건가요?? DFS로 계속 돌면 어차피 경로는 똑같이 가져야하는게 아닌가요???
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
맥북(mac os) 자동 채점 방법을 고민해보았습니다.
출력값이 긴 파일은 하나씩 눈으로 보고 체크하기가 어려워서 방법을 찾아보았습니다. 별다른 설치 파일 필요 없이 그냥 리눅스 명령어로 만들어진 쉘 스크립트만 생성해주면 되므로 간단합니다. 다른 언어로 개설된 강의를 듣는 mac유저들도 쉘 스크립트로 빠르게 채점이 가능할 듯합니다. 1. 쉘 스크립트 생성 작성한 코드가 있는 폴더에서 run.sh 파일을 생성합니다. 해당 파일을 열어서 아래 내용을 붙여넣어줍니다. 실행할 cpp 파일 명은 code.cpp로 바꾸어주세요. #!/bin/bash g++ code.cpp -o code "./code" "./test/in1.txt" "./test/result1.txt" "./code" "./test/in2.txt" "./test/result2.txt" "./code" "./test/in3.txt" "./test/result3.txt" "./code" "./test/in4.txt" "./test/result4.txt" "./code" "./test/in5.txt" "./test/result5.txt" echo "test1 :" && diff -w -s "./test/result1.txt" "./test/out1.txt"&& echo " " echo "test2 :" &&diff -w -s "./test/result2.txt" "./test/out2.txt"&& echo " " echo "test3 :" &&diff -w -s "./test/result3.txt" "./test/out3.txt"&& echo " " echo "test4 :" &&diff -w -s "./test/result4.txt" "./test/out4.txt"&& echo " " echo "test5 :" &&diff -w -s "./test/result5.txt" "./test/out5.txt"&& echo " " 2. 채점 파일 등록 해당 폴더에 test폴더를 생성하여 채점 파일에 있는 파일들을 넣어줍니다. 3. 메인 코드 수정 메인의 코드를 살짝 수정해주어야 합니다. code.cpp파일을 열어 아래와 같이 수정 해 줍니다. int main(int argc, char* argv[]){ freopen(argv[1], "rt", stdin); freopen(argv[2], "w", stdout); main함수에 매개 변수를 입력할것이므로 인자를 넣어주고 결과 파일을 작성할 코드도 추가합니다. 4. 실행 cpp 파일이 있는 폴더에서 쉘 스크립트를 실행합니다. $ sh run.sh 5. 결과 확인하는 법 성공 내가 작성한 코드의 결과값과 채점파일의 답이 일치하면 identical이라는 문구가 뜹니다. 실패 틀린 답은 해당 번호에 코드 출력 결과값을 보여줍니다. 구분선 --- 위쪽은 내가 작성한 코드의 출력값, 아래는 채점 파일의 출력값입니다. 실행시간 확인하기 c++코드에서 시간 라이브러리를 넣어 측정할 수 있지만 귀찮아서 시간 측정은 잘 안했는데 리눅스 명령어로도 확인이 가능하네요. #!/bin/bash g++ code.cpp -o code time "./code" "./test/in1.txt" "./test/result1.txt" time "./code" "./test/in2.txt" "./test/result2.txt" time "./code" "./test/in3.txt" "./test/result3.txt" time "./code" "./test/in4.txt" "./test/result4.txt" time "./code" "./test/in5.txt" "./test/result5.txt" 이렇게 실행 명령어 앞에 time 을 붙여주면 실행 시간을 출력해줍니다. 쉘 스크립트 문법을 몰라서 그냥 한줄 한줄 작성했는데 세련되어보이진 않지만 채점파일 추가,삭제는 직관적으로 가능하다는 장점이 있다고 우겨보겠슴다. 수정하고 싶은 부분은 간단한 검색으로도 많은 자료가 있으니 수정하셔서 사용하면 될 듯합니다. 궁금하거나 수정할 부분이 있다면 알려주세요.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
학습방법 질문
안녕하세요 선생님 강의를 최근 수강하기 시작한 알고리즘 초보자입니다. 문제를 푸는 과정에서 아예 풀지 못하거나 제 코드보다 선생님의 코드가 더 효율적이고 우수한 경우에 그 코드를 곱씹어서 이해하고 다시 그 코드를 따라해보는 것으로도 공부가 될까요? 또 문제가 막혔을 때 1~2일 정도 고민하고 도저히 풀리지 않을 때 선생님의 강의를 보고 있습니다. 이정도 고민이면 충분한가요? 선생님이 정보 올림피아드 학생들을 가르치면서 조언해주신 공부방법을 알려주신다면 정말 감사하겠습니다. 제가 알고리즘 공부는 처음이라 틀렸을 경우 어떻게 복습하고 공부하는지 잘 모릅니다. 긴 글 읽어주셔서 감사합니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
풀이가 잘못된 것 같습니다...
쓰이지 않은 소수같은 경우에도 소수이지만 쓰이지 않았으니 0으로 출력되어야하지 않나요 ? 저렇게 코드를 짜면 825를 표현하는 ( 0 1 2 0 1) 같은 경우에는 2와 7이 쓰이지 않아서 0임에도 불구하고 출력되지 않고 1 2 1로 출력되어서 2가 한 번, 3이 두 번, 5가 한 번 쓰였다고 출력되는 것과 같지 않나요. 마지막에 23 번째 줄부터 시작되는 출력문에서 if(ch[i]!=0) 문 말고 for 문 하나 더 만들어 i 가 소수인지 판별하는 식을 세우고, i가 소수면 i를 index로 가지는 배열값을 출력시킨다는 조건을 추가하면 소수인 배열값 0 도 출력시킬 수 있을 것 같습니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
35번 질문드립니다.
강사님 항상 좋은 강의에 감사드립니다! 현재 입력 값에서 양수가 순서대로 되어있어서 만약에 순서대로 되어있지 않다면 아래와 같은 식으로 하면 될까요? for(i=0; i<n-1; i++){ for(j=0; j<n-i-1; j++){ if(arr[j]>0 && arr[j+1]<0){ tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } else if(arr[j]>0 && arr[j+1]>0) { if(arr[j] > arr[j+1]){ tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
동적할당을 하셨는데 혹시 vector로 하게 되면 문제가 되나요??
동적할당으로 마구간 좌표를 잡으셨는데 vector로 잡게 되면 문제가 되는건가요??? 그리고 동적할당할때 그냥 시작을 1로 하시려고 n+1로 잡으신 건가요?? 만약 0부터 시작하면 그냥 n으로 해도 되는건가요??
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
다르게 코딩했는데, 특정 부분 오류의 이유를 모르겠어 질문드립니다.
안녕하세요 교수님! 강의 보면서 정말 도움 많이 받고 있습니다. 다름이 아니라, 이 문제를 for문, while문을 써서 풀려고 하다가 막혀서 질문드립니다. 제 코드는, //가장 많이 사용된 숫자의 개수 #include<iostream> using namespace std; int main() { int a; int arr[10]; cin >> a; int k=a; while (k >= 1) { for (int i = 0; i < 10; i++) { if (i = k % 10) arr[i]++; } k = k / 10; } for (int i = 0; i < 10; i++) { cout << arr[i] << " "; } return 0; } 이렇게 해서 일단 arr의 배열에 잘 들어갔는지 확인 하려고 했는데, 출력 값이 안나옵니다. 일단 while loop를 빠져나오지 못하는 것으로 판단되는데, 왜 저기를 빠져나오지 못하는지 모르겠어서 질문 드립니다. 감사합니다!
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
22번 온도의 최대값
#include <iostream> #include <vector> using namespace std; int main() { int n, k, sum = 0, max = 0; cin >> n >> k; std::vector<int> a(n); for (int x = 0; x < n; x++) { cin >> a[x]; } for (int x = 0; x < k; x++) { sum += a[x]; } max = sum; for (int x = k; x < n; x++) { sum = sum + (a[x] - a[x - k]); if (max < sum) { max = sum; } } cout << max; return 0; } 코드에 어떤 문제가 있는건지 모르겠습니다.
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
flag 사용하지 않고 바로 return 0;
강사님 안녕하세요. 수업 잘 듣고있습니다. 아래 다른 분 께서 exit();로 종료하는 것에 대해서 질문주셨는데, exit(); 대신 그냥 return 0;로 끝내는 것은 어떤지 여쭙고 싶습니다. 1. 실전에서 return 0;로 종료하는 것도 금지시키는 경우가 있나요? 2. flag를 사용하는 방법과 return 0로 끝내는 방법 중 어느 방법이 효율적인 방법인지, 혹은 더 좋은 코드인지 알고싶습니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문 있습니다
안녕하세요 선생님. 고민 끝에 선생님이 해결하신 방법과 유사하게 해결하였습니다. 그런데 이와같이 해결하면, 이런부분도 가능한건지가 궁금하였습니다. 1) 바로 어떠한 +나 -연산자도 사용하지 않은 채 원소 하나만 있는 경우와, 2) 아예 어떠한 원소도 사용하지 않는 경우 인데요 위 두 경우를 문제에서 허용하고 있는지 궁금합니다. ===================================== 예를 들어 위와 같이 구현한 후, 문제 형식에 맞게 입력을 줄 때 2 1 1 2 로 입력을 주면 -1 +2 = 1 1 = 1 로써 2가 출력되고, 또다른 예로 2 0 1 2 로 입력을 주면 "어떤 원소도 연산에 참여하지 않는 경우" 에 따라 1이 출력됩니다. 이렇게 출력되는 경우를 문제에서 허용하는지 궁금합니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
문제 접근법에 관해 질문 드립니다.
안녕하세요 선생님 강의 잘 듣고있습니다. 본 문제도 동적 프로그래밍 알고리즘이 적용된 문제라고 봐도 되나요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
구조체를 사용해 우선순위 큐를 사용하던중 이 코드가 왜 틀리는 건지 모르겠습니다.
안녕하세요! 좋은 강의 찍어주셔서 감사합니다.! 구현체를 사용하여, 우선순위 큐를 구현해 문제를 풀었는데, 틀렸다고 떠서요. 동일 코드를 pair를 사용해 우선순위 큐 구현하여 코드를 올리면 맞았다고 뜹니다. 혹시 제가 잘못 사용했거나, 놓친 부분이 있을까요? (문제 링크입니다: https://www.acmicpc.net/problem/13549) //정답 코드 #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; int vis[200001]; int main(){ cin.tie(0); cout.tie(0); std::ios::sync_with_stdio(false); int n,k; cin>>n>>k; priority_queue <pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> >> pq; pq.push({0,n}); vis[n]=1; int res=987654321; while (!pq.empty()) { int move=pq.top().second; int cnt=pq.top().first; pq.pop(); if(move==k){ res=cnt; break; } if(move*2<=200000&&vis[move*2]==0){ pq.push({cnt,move*2}); vis[move*2]=1; } if(move-1>=0&&vis[move-1]==0){ pq.push({cnt+1,move-1}); vis[move-1]=1; } //한칸 뒤 이동 if(move+1<=200000&&vis[move+1]==0){ pq.push({cnt+1,move+1}); vis[move+1]=1; } } cout<<res<<"\n"; return 0; } //틀린코드 #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <cmath> using namespace std; int vis[200001]; struct qu{ int m,val; qu(int a,int b){ m=a; val=b; } bool operator<(const qu & b)const{ return val>b.val; } }; int main(){ cin.tie(0); cout.tie(0); std::ios::sync_with_stdio(false); int n,k; cin>>n>>k; priority_queue<qu>pq; pq.push(qu{n,0}); vis[n]=1; int res=987654321; while (!pq.empty()) { int move=pq.top().m; int cnt=pq.top().val; pq.pop(); if(move==k){ res=min(cnt,res); break; } if(move*2<=200000&&vis[move*2]==0){ pq.push(qu(move*2,cnt)); vis[move*2]=1; } if(move-1>=0&&vis[move-1]==0){ pq.push(qu(move-1,cnt+1)); vis[move-1]=1; } //한칸 뒤 이동 if(move+1<=200000&&vis[move+1]==0){ pq.push(qu(move+1,cnt+1)); vis[move+1]=1; } } cout<<res<<"\n"; return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
C++를 사용하지 않고 문제를 해결하고싶습니다.
문제에서 sort함수를 이용하여 정렬을 해주는데 만약 C++ 함수들을 사용하지 않고 C로만 문제를 해결하려고 하는데 방법이 있을까요? #include<stdio.h> #include<math.h> #include <stdlib.h> #define MAX(x, y) x > y ? x : y int main(void) { int s,n,m,a,i,j,pos=0; scanf("%d",&n); int *arr=(int*)malloc(sizeof(int)*n); for(i=0;i<n;i++) { scanf("%d",&arr[i]); } scanf("%d",&m); int *brr=(int*)malloc(sizeof(int)*m); for(i=0;i<m;i++) { scanf("%d",&brr[i]); } int *sum=(int*)malloc(sizeof(int)*MAX(n,m)); int left=0,right=0; while(left<n && right<m) { if(arr[left]==brr[right]) { sum[pos++]=arr[left++]; right++; } else if(arr[left]<brr[right]) { left++; } else if(arr[left]>brr[right]) { right++; } } for(i=0;i<pos;i++) { printf("%d ",sum[i]); } free(arr); free(brr); free(sum); return 0; } 저는 이 부분에서 정렬을 하지못하여 막혀있습니다.
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문있습니다.
54. 올바른괄호 (STL stack 자료구조 활용) 문제를 강의 내용대로 코드를 짜서 해결을 했습니다. 그런데 소스파일을 보니 #include<bits/stdc++.h> using namespace std; int main(){ //freopen("input.txt", "rt", stdin); stack<char> s; string str; cin>>str; for(auto x : str){ if(x=='(') s.push(x); else{ if(s.empty() || s.top()!='('){ cout<<"NO"; return 0; } s.pop(); } } if(s.empty()) cout<<"YES"; else cout<<"NO"; return 0; } 코드가 이런식으로 나와있는데 여기에서 굵은 글씨 친 부분의 의미가 무엇인지 궁금합니다.
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
10번 자릿수의 합에서 질문이 있습니다.
main 코드는 정답에 있는 그대로 작성하고 digit_sum만 제가 작성한것으로 돌렸는데 에러는 발생하지 않지만 실행이 안됩니다(print가 아예 안됩니다ㅠ) int digit_sum(int x){ int n, sum=0; for(;x>10;x/10){ n = x%10; sum += n; } sum += x%10; return sum; } 어떤것에 문제가 생긴건가요? 제가 의심되는 부분은 for문 (;;) 안에서 변화식을 x/10으로 작성한 부분이 걸립니다. 구글링으로 본 다른 코드에서는 for문에서 선언한 변수를 제어하는 부분이라고 i++과 비슷한 형태로만 작성되었더군요. 저는 단순히 for(반복문 돌리기전 초기 실행 ; 조건식 ; 1회 반복 후 실행) 으로 생각하고 작성했는데 혹시 for(;;)에서 작성할때 유의사항이 있나요? 다음은 전체 코드입니다. #include <iostream> using namespace std; int digit_sum(int); int main(){ freopen("input.txt", "rt", stdin); int n, num, i, sum, max=-2147000000, res; scanf("%d", &n); for(i=0; i<n; i++){ scanf("%d", &num); sum=digit_sum(num); if(sum>max){ max=sum; res=num; } else if(sum==max){ if(num>res) res=num; } } printf("%d\n",res); return 0; } int digit_sum(int x){ int n, sum=0; for(;x>10;x/10){ n = x%10; sum += n; } sum += x%10; return sum; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
동적 할당 정적할당
선생님의 풀이를 보면 매우 큰 배열 일때는 동적할당을 하고 100정도의 작은 배열에서는 정적할당을 하시던데 1000정도의 애매한 크기에서는 정적으로 선언할 떄도 있고 정적으로 선언할 떄도 있네요. 그리고 어떨 때는 전역으로 선언하고 어떤떄는 지역으로 선언하시던데 혹시 그 기준이 있으신가요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
질문있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 선생님 풀이 가운데 struct로 생성된 State는 생성자가 있는데 Lion은 왜 생성자가 없나요? 생성자를 만들어야하는거 아닌가요?