월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
41번 질문있습니다!
강사님 강의 잘 듣고있습니다. 다름이 아니라 제가 생각해낸것은 1부터 n 까지의 합 공식을 이용해서 연속된 숫자들의 합을 계산해둔 것인데, 예를들어 4+5+6이면 1부터 6까지의 합공식 -> 6*7/2 = 21 에서 1부터 3까지의 합공식 -> 3*4 /2 = 6을 빼면 되는것 같아서 밑에처럼 짜봤습니다. #include<iostream> using namespace std; int main() { int n; cin >> n; int ans = 0; int k; for (int i = n-1; i >=1; i--) {// i를 역순으로 하면 개수가 작은놈부터 출력 i를 정순으로 하면 개수가 많은놈부터 출력 for (int j = 1; j < n - 1; j++) { if (i*(i + 1) - j * (j - 1) == 2 * n) { for (k = j; k < i; k++) { cout << k << "+"; } cout << i << " = " << n << endl; } } } return 0; } 근데 아무리 봐도 효율이 좋은것같지는 않네요.. 교수님 코드처럼 생각해내는게 중요한데 아직 거기까진 못간것같습니다.. 면접때 이런 질문이 나왔다고 하셨는데 제가쓴 방식대로 해도 괜찮은건가요? 처음 딱 봤을때 교수님 풀이를 생각해낼것 같지는 않아서 질문드립니다.. 이렇게 짜도 결과는 같게 나오는것 같습니다!
- 해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
코딩테스트를 준비할때 STL에 관해 여쭤보고싶습니다.
인녕하세요 강사님. 게임 개발자쪽으로 공부하고 있는 학생입니다. 많은 게임회사들도 코딩테스트를 보길래 이번에 저도 공부하게 되었는데 16번까지 진행하면서 의문점이 생겨서 여쭤보고 싶습니다. 코딩테스트에서 이미 만들어져 있는 STL 컨테이너들이나 함수들을 사용해서 문제를 푸는 것보다 기초적인 변수들을 이용해 알고리즘을 직접 짜내는 쪽이 더 좋을까요? 코딩테스트들을 어떤 방향성으로 공부하는것이 좋은지 여쭤보고 싶습니다. 이번 16번 문제를 보고 바로 map이 떠올라서 map을 이용해서 풀긴 했으나, 강사님 답안을 보니 아스키코드를 이용해서 문제를 해결하신 것을보고 , 제가 너무 STL에 의존해 있나 고민하게 되었습니다. 또 문제마다 특정 함수를 만들어서 풀라는 문제가있었고 그렇지 않은 문제들도 있었는데 특정 함수를 만들라는 말이 없으면 그냥 main에서만 수행해야하는지도 여쭤보고 싶습니다. 아래는 제가 푼 방법입니다. #pragma once #include <iostream> #include <string> #include <map> using namespace std; void GetMapString(string str, map<char, int>& m) { for (int i = 0; i < str.length(); i++) m[str[i]] = m[str[i]] + 1; } int main() { string str1; string str2; bool bflag = true; map<char, int> map1; map<char, int> map2; cin >> str1; cin >> str2; GetMapString(str1, map1); GetMapString(str2, map2); if (map1 != map2) bflag = false; if (bflag) cout << "TRUE" << endl; else cout << "FLASE" << endl; return 0; }
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
플로이드 워샬 알고리즘
안녕하세요 선생님 16: 17 ~ 16~30 쯤 들어보면 돌아서 가니까 2가 2번 나올 수는 없다고 말씀해주셨는데 그렇게 코드가 작성되도록 문제가 나오는건가요?? 2가 두번 나올 수 있게끔 그래프를 만들 수 있기는 한데 그렇게는 안나오는건가요??
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
공부 방법에 관한 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강사님 제가 c, c++ 기본적인 문법만 가지고 풀기에 20번대 이후부터 자꾸 막히는 시간이 늘어나서 3시간동안 2문제, 3문제 푸는 경우가 많아서 질문드립니다. 1. 어느정도 고민하고 강의를 보는게 좋을까요? 2. 모르는 문제는 강의를 보고 이해 하며 따라가도 제가 스스로 푼 문제보다 습득한 정도가 떨어진다고 생각합니다. 모든 문제를 쭉 풀고 못 푼 문제만 따로 복습하고 복습해서 이 강의를 완벽하게 끝내는게 좋을까요? 아니면 다른 백준이나 여러 사이트에서 더 많은 문제를 푸는게 좋을까요?
- 미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
탐색할 때 사용하는 배열에 대해 질문이 있습니다
응용해서 다른 문제를 풀어봤는데 배열을 바꾸면 정답이 계속 바뀝니다...! #include <iostream> #include <algorithm> #include <vector> using namespace std; vector<vector<int>> map(201, vector<int>(201, 1)); vector<vector<int>> visited(201, vector<int>(201, 0)); vector<pair<int, int>> cctvx[4], cctvy[5]; int res = INT_MAX, n; int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 }; void DFS(int x, int y,int timer,int cctvi) { int xx, yy; if (x == n && y == n) { res = min(timer, res); } else { while (cctvx[cctvi][0].first <= x && x <= cctvx[cctvi][0].second&&cctvy[cctvi][0].first <= y && y <= cctvy[cctvi][0].second) { timer++; cctvi++; if (cctvi == 4) cctvi = 0; } for (int i = 0; i < 4; i++) { xx = x + dx[i]; yy = y + dy[i]; if (xx<1 || xx>n || yy<1 || yy>n) continue; if (map[xx][yy] == 0 && visited[xx][yy] == 0){ visited[xx][yy] = 1; timer++; cctvi++; if (cctvi == 4) cctvi = 0; DFS(xx, yy,timer,cctvi); visited[xx][yy] = 0; } } } } int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> map[i][j]; } } cctvx[0].push_back(make_pair(0, n / 4)); cctvx[1].push_back(make_pair(n - (n / 4), n)); cctvx[2].push_back(make_pair(n - (n / 4), n)); cctvx[3].push_back(make_pair(0, n / 4)); cctvy[0].push_back(make_pair(0, n / 4)); cctvy[1].push_back(make_pair(0, n/4)); cctvy[2].push_back(make_pair(n - (n / 4), n)); cctvy[3].push_back(make_pair(n - (n / 4), n)); visited[1][1] = 1; DFS(1,1,0,0); if (res == INT_MAX) { cout << -1; return 0; } else cout << res; return 0; }
- 미해결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; }