묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-G 문제 질문드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. return a.first> b.first; 부분이 이해가 잘 안되는것 같습니다.저는 부등호가 반대로'<' 인거 같은데 제가 헷갈리고 있는거 같아서 질문드립니다.감사합니다.!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1 - J 질문입니다
안녕하세요 선생님, 코드에서 이해가 안되는 점이 있어서 질문드립니다!_map[b]++ 에서 b만 더해가는게 의상종류는 상관없어서 하나만 넣어서 더하는건가요?ret *=((long long)c.second + 1); 에서 c.second로 끄집어내는게 b를 더해서 인가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1 - E 질문입니다
안녕하세요 선생님, 수업 잘 듣고 있습니다.문제 내용 중에 '첫 글자가 같은 5명의 선수를 비교' 해야 할 것 같은데, 이건 해설풀이 중에 어느부분에서 해석할 수 있을까요?선수이름(s)을 받아서 앞쪽으로 당긴 다음에 더해간다, 나중에 'a'값을 더해서 원래 소문자를 구해서 출력한다, 까지는 이해하겠는데 문의드린 부분이 이해가 안가서요ㅜ 아니면 선생님 코드는 비교 안해도 값이 나오는 건가요..?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
구름 IDE에서 cin, scanf 입력받기
안녕하세요.곧 코딩테스트가 있어 문의드려요..강의와 무관하지만; 물어볼 곳이 없어 글을 남깁니다.구름 IDE로 볼 예정인데 거기선 cin,scanf 입력을 어디에 넣나요;;? 평소에는 dev c++로 돌려보는데 그건 디버깅을 하면 새 창이 떠서 거기에 입력 값을 넣었거든요.ㅠㅠ 구름 쪽에 문의 했는데 답이 없어 선생님께 문의드려용 ㅠㅠ..
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-B 맞왜틀, 모범답안 질문
http://boj.kr/53420caa64384937bd61e46faf8210a7안녕하세요 강사님 제 풀이가 강사님 풀이 메인로직이랑 다르긴 하지만 그래도 논리는 맞는데 틀렸다고 떠서 왜 틀렸는지 질문올립니다!그리구 강사님 모범답안 코드 중for(char a : str){ cnt[a - 'a']++; }이부분이 전체적으로 이해가 안돼서 부연 설명 부탁드려요ㅠㅠ강의 내용 중 cnt['a'] 가 cnt[97]이라는 설명이랑 122-97을 통해 배열을 앞으로 땡겨서 cnt[0~25]를 만든다는 설명은 이해가 가는데, 그래서 왜 cnt[a - 'a']++; 이 문장이 나오는건지는 잘 모르겠어요ㅠ122-97을 하려면 cnt['z' - 'a']가 아닌가요..?그리구 왜 앞의 a는 ''가 없고 뒤의 a는 ''가 있나요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
블로그에 공부내용 정리
안녕하세요 교수님, 다름이 아니라 제 개인 블로그에 알고리즘 공부내용을 작성하려고 하는데 우선 교수님의 허락을 맡아야 될 것 같아서 여쭤봅니당,,,, 강의자료나 세부적인 내용은 유출하지 않고 오직 알고리즘관련된 내용들만 적어도 될까요??
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-I 시간초과 질문 있습니다.
#include <bits/stdc++.h> using namespace std; int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N, M; cin >> N >> M; map<int, string> book; vector<string> answer; for (int i = 1; i <= N; i++) { string pokemon; cin >> pokemon; book[i] = pokemon; } for (int i = 0; i < M; i++) { string question; cin >> question; for (auto const &[k, v] : book) { if (to_string(k) == question || question == v) { answer.push_back(isalpha(question[0]) ? to_string(k) : v); break; } } } for (auto str : answer) cout << str << '\n'; return 0; }해당 코드에서 시간 초과가 나는데 for (auto const &[k, v] : book) { if (to_string(k) == question || question == v) { answer.push_back(isalpha(question[0]) ? to_string(k) : v); break; } }아마 이 부분에서 시간 초과가 나리라 생각합니다. O(NlogN) 일거 같은데 답안과 달리 map 1개와 find 만 써서 풀 수는 없는걸까요? 왜 시간초과가 나는지 이해가 잘 안갑니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
입출력싱크
안녕하세요 선생님 입출력싱크가 들어가는 위치는 어디가 되어야 하나요? using namespace std;밑에 바로 쓰면 에러가 나는것 같습니다. 메인함수 시작할때 항상 쓰시는거같은데 어디에 왜 그곳에 써야하는지 설명해주시면 감사하겠습니다! ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
-
해결됨파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
뒤집은 소수 res 식
안녕하세요 뒤집은 소수 res 식에 대하여 궁금해서 질문 올립니다.저는 그냥 맨 뒤가 0인 경우를 무한 반복문으로 돌리고, 수를 다시 갱신하고, 맨 뒤가 0이 안 되는 경우 반복문을 빠져나와 [::-1]로 갱신하여 처리하였습니다.하지만 res=res*10+t의 식을 아무리 봐도 이해가 안 되어서 여쭤봅니다!!!
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이렇게 풀어도 되는 건지 여쭤보고 싶습니다!
항상 감사합니다.
-
해결됨it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
64번 스택 오버플로우 뜨는 이유가 궁금합니다!
제가 푼 방식은 정점이 n번까지 다다르면 카운트를 하나 올리고 방문여부를 체크하던 배열을 원상태로 초기화하는 방법입니다.근데 이게 m이 작을 때는 잘 작동하는데 m이 커지는 순간 스택 오버플로우가 발생합니다..! 손그림 그려서 해봤는데 스택 오버플로우가 발생할 것 같기도 하고 왜 발생하는 건가 싶기도 해서 질문드립니다...(너무 긴가민가해서 좀 더 명쾌한 이유를 알고 싶어서요 ㅠㅠ)#include<iostream> using namespace std; #include<vector> #include<algorithm> #include<string> int n, m; // 정점 n개, 간선 m개 vector<vector<int>> adjacent; // -1은 연결 없음 vector<int> visited; int ans = 0; void DFS(int pre) { if (pre >= n) // n에 다다르면 카운트 증가, 방문 배열 초기화 { ans++; visited.clear(); visited.resize(n + 1, 0); return; } visited[pre] = 1; // 일단 방문했으니 체크 for (int i = 1; i <= n; i++) { // 방문한 적 있거나 연결 끊겨있으면 continue해서 무시 if (visited[i] == 1 || adjacent[pre][i] == -1) continue; DFS(i); // 그 외라면 DFS 재귀호출 } } int main(void) { cin.tie(NULL); ios_base::sync_with_stdio(false); freopen("input.txt", "rt", stdin); // 파일 입력받음 cin >> n >> m; adjacent.resize(n + 1, vector<int>(n + 1, -1)); for (int i = 0; i < m; i++) { int s, e; // 시작 정점, 도착 정점 cin >> s >> e; adjacent[s][e] = 1; } visited.resize(n + 1, 0); DFS(1); cout << ans; }아 그런데 스택 오버플로우 생기는 것 땜에 강사님 설명 봤고, 설명을 통해 고친 내용은 완벽히 이해된 상태입니다! 그냥 스택 오버플로우 발생 이유를 정확히 알고 싶어 질문드립니다 감사합니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
트리를 그리는 방식이 이해가 가지 않습니다 ㅜ
http://boj.kr/5128abfdc4364c3d8f22f41b1ecc30f4테스트 케이스가 모두 맞긴 하는데 계속 틀려서 질문 게시판을 보니 어떤 분께서 루트가 무조건 0이 아닌 케이스들이 있다며(https://www.acmicpc.net/board/view/104534) 예시를 드셨는데요. 해당 예시가 어떤 순서로 형성되는 것인지 잘 이해가 가지 않습니다.. ㅜ 루트 노드가 어떻게 4가 되는지?4의 자식 노드들의 노드 번호가 어떻게 3,5가 되는 것인지 등등 입니다!
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
해당 문제를 BFS로 풀었을 때와 DP로 풀었을 때 시간복잡도가 궁금합니다.
안녕하세요. 강사님. 강의 잘 보고 있습니다.저도 다른 분을과 비슷하게 처음에 BFS로 문제를 풀었습니다.확실히 DP로 푼 강사님의 코드가 훨씬 간결하긴한데 DP가 BFS보다 얼마나 효율적인지 잘 감이 잡히지 않습니다.각각 어떤 시간복잡도를 갖는지 궁금합니다. 감사합니다! # BFS 풀이 from collections import deque N = int(input()) valley = [list(map(int, input().split())) for _ in range(N)] dx = [1, 0] dy = [0, 1] def bfs(x, y): q = deque() q.append([x, y]) visted = [[int(1e9)] * N for _ in range(N)] visted[x][y] = valley[x][y] while q: x, y = q.popleft() for i in range(2): nx = x + dx[i] ny = y + dy[i] # 맵을 벗어나면 continue if nx >= N or ny >= N: continue # visted 표기 더 작은 경우에만 if visted[nx][ny] > valley[nx][ny] + visted[x][y]: visted[nx][ny] = valley[nx][ny] + visted[x][y] q.append([nx, ny]) return visted[N - 1][N - 1] print(bfs(0, 0))
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
채점프로그램 구동 문제
안녕하세요 수업 열심히 듣고 따라가는 학생입니다!37번 문항에 질문 및 문제가 생겨 문의드립니다. 아래와 같은 코드를 작성했고, 이를 실행 후 채점폴더를 활용해 채점했을때 test 3,4,5번에서 exit_code 에러가 발생합니다.#include <iostream> using namespace std; int scan(int n, int* arr, int len); int main() { int S; int N; int scanres; cin >> S >> N; int* cache = new int[S](); int* work = new int[N]; for(int i = 0; i<N; i++){ cin >> work[i]; } cache[0] = work[0]; for(int i = 1; i<N; i++){ scanres = scan(work[i], cache, S); if(scanres != -1){ //캐시에 있다 for(int j = scanres - 1; j >= 0; j--){ cache[j+1] = cache[j]; } cache[0] = work[i]; } else{ //캐시에 없다 for(int j = S-1; j >= 0; j--){ cache[j+1] = cache[j]; } cache[0] = work[i]; } } for(int i = 0; i<S; i++){ cout << cache[i] << " "; } return 0; } int scan(int n, int* arr, int len){ for(int i = 0; i < len; i++){ if(arr[i] == n) return i; } return -1; }아무리 봐도 문제를 모르겠어 input 3,4,5를 열고 제 코드에 대입해 실행해본 결과 output 3,4,5와 일치하는 결과가 출력되었습니다.아래 그림에서 왼쪽은 채점프로그램 점수이고, 오른쪽 위는 input 3 프로그램 실행시 결과, 그 아래는 output 3 파일입니다. input3 실행결과와 output3 결과가 일치하는것을 확인하실 수 있습니다.어느부분에서 에러가 나는 것인지 조언 부탁드리겠습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-A 일곱난쟁이를 예로 들어 코테의 문제 조건 적용 범위 질문
http://boj.kr/35d6f320e0d042ea9331b757b1e5bf15안녕하세요 위 링크에 제가 작성한 코드가 있습니다.일단 제가 알고리즘 문제를 풀어보는게 이 문제가 처음이라서, 문제에 제시된 조건을 코드에 어느정도로 적용해야 하는지 감이 안잡히는것 같아서 질문올립니다.뭔소리냐면 예를 들어 이 일곱난쟁이 문제를 처음 딱 봤을때 저는,"주어지는 키는 100을 넘지 않는 자연수""아홉 난쟁이의 키는 모두 다르며"라는 두가지 입력 조건이 있다고 인식을 했고, 두 조건의 코드 구현에 대해 고민하는데에 1시간을 썼지만 결국 첫번째 조건에 대해서만 코드로 구현하는 데 성공했습니다.if(a[i]<1 || a[i]>100){cout << "1~100 사이의 수를 입력하세요!" << "\n";a[i] = 0;i--;continue;}<< 이 부분이 첫번째 조건을 구현한 부분입니다."100을 넘지 않는 자연수" 이외의 숫자를 입력 시 경고문구와 함께 입력한 숫자가 없어지고 그 자리에 다시 입력하도록 하는 코드입니다.(두번째 조건인 "입력 숫자는 중복이 불가"도 나름 고민을 해봤지만 도저히 컴파일 결과가 원하는 대로 안나와서 일단 그부분은 지우고 위의 링크 상태로 백준에 제출한 것입니다.)컴파일 시 문제의 예제입력1을 넣으면 예제출력1과 동일하게 결과가 나오지만, 백준 결과는 틀렸다고 나왔습니다.그래서 뭐가 틀렸나 강의와 모범답안을 확인해보니 제가 고민했던 조건 2가지에 대한 코드가 답안에는 아예 없더라구요?!바로 이 부분에서 제가 혼란이 와서 질문드립니다ㅠ제 생각엔 제시된 예제입력 외의 모든 상황에서도 결과가 똑바로 나와야 하기 때문에, 숫자 입력 시 -1이나 200같은 범위 외 숫자를 입력하거나 이미 입력한 숫자를 또 입력할 경우는 문제에 제시한 조건에 부합하지 않아 결과가 바르지 않으므로, 애초에 코드 짤때부터 이 모든 부분을 방지해야 한다고 생각을 했는데, 이런 생각 자체가 너무 깊게생각한걸까요?앞으로 모든 문제에 있어서 이런 식으로 문제에서 구현 조건처럼 보이는 문구들이 있어도 전부 구현할 필요 없이 단순히 제공된 예제의 케이스만 바르게 나오도록 간소화해서 코드를 짜면 되는건지..그 조건 적용 범위나 기준이 암묵적으로 있는지 이런 것들이 궁금합니다. 확실히 이부분을 고려해서 코드를 짜냐 안짜냐가 소요 시간에 엄청난 영향을 끼치니까요ㅠㅠ아, 그리고 추가로 이번 난쟁이의 경우처럼 제가 모범답안 외 추가적으로 작성한 코드에 의해 컴파일은 잘 되지만 백준 결과가 틀렸다고 나올 경우에 제가 작성한 부분을 뇌에서 지우고 그냥 모범답안으로 외워야 할까요? 아니면 해당 부분이 제 생각에 문제 논리를 거스르지는 않는 부분이라고 판단되면 그냥 제가 생각한 로직대로 기억해도 되는걸까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-A 질문
강의를 안보고 처음 짠 코드에서 무엇이 잘못됬는지 몰라서 답답해서 질문드립니다.이 코드의 반례를 알 수 있을까요? 혹은 어느 부분이 틀렸는지입니다. #include <iostream> #include <cstring> #include <climits> #include <algorithm> using namespace std; int n; int dp[20][20][20]; int w[20][20]; int visit[20]; //bidx == 시작한 처음 위치 void search(int cnt, int from, int dist, int bidx) { if (cnt == n - 1 && w[from][bidx] > 0) { int nd = dist + w[from][bidx]; if (dp[from][bidx][cnt] < nd) return; dp[from][bidx][cnt] = nd; return; } for (int i = 0; i < n; ++i) { if (from == i || visit[i] || w[from][i] == 0) continue; int nd = dist + w[from][i]; if (dp[from][i][cnt] > nd) { dp[from][i][cnt] = nd; visit[i] = 1; search(cnt + 1, i, nd, bidx); visit[i] = 0; } } } int main() { cin >> n; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { cin >> w[i][j]; } for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) for (int k = 0; k < n; ++k) dp[i][j][k] = INT_MAX; for (int i = 0; i < n; ++i) { memset(visit, 0, sizeof(visit)); visit[i] = 1; search(0, i, 0, i); } int answer = INT_MAX; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { answer = min(answer, dp[i][j][n - 1]); // cout << dp[i][j][n - 1] << " "; } // cout << "\n"; } cout << answer; return 0; } 접근 방법은 3차원 dp를 dfs로 탐색한 거리를 저장해두는 것입니다. 그래서 다음에 같은 dp[from][to][cnt] 가 존재할 때, 반드시 새로운 값이 낮을 때만 재귀를 수행하게 됩니다.재귀 끝내는 파트인 cnt == n- 1에서는 모든 노드를 순회했고 시작부분을 더하기 위해 w[from][bidx] 가 0이 아닌 경우에만 값을 구하게 됩니다. 그래서 마지막 dp[][][n-1] 중 가장 작은 값을 정답으로 가져옵니다.백준 질문하기에서 대부분 반례를 시도해보고 디버깅도 시도해봤는데 뭐가 잘못됬는지 알기 어려워 답답한 마음에 질문드립니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-O 왜 틀렸다고 나오는 것일까요??ㅜㅜ
큰돌님 강의를 보고 혼자서 다시 풀어보았는데 저는 bool타입의 check변수를 사용하지 않고 풀어봤습니다. 그런데 그 결과 틀렸다고 뜨더군요ㅜㅜㅜ... 반례가 무엇인지 정말 궁금해요 #include <bits/stdc++.h> using namespace std; string s, n; int main() { ios_base::sync_with_stdio(false); cin.tie(0); while(true) { stack<char> stk; bool flag = true; getline(cin, s); if(s == ".") break; for(int i = 0; i < s.size(); i++) { if(s[i] == '(' || s[i] == ')' || s[i] == '[' || s[i] == ']') { if(!stk.size()) { stk.push(s[i]); continue; } if(s[i] == '(' || s[i] == '[') stk.push(s[i]); else if(s[i] == ')') { if(stk.top() == '(') stk.pop(); } else if(s[i] == ']') { if(stk.top() == '[') stk.pop(); } } } if(stk.size()) cout << "no" << "\n"; else cout << "yes"<< "\n"; } return 0; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-R 질문있습니다
안녕하세요 선생님.저는 DFS 함수를 리프노드인지 체크하고, 리프노드가 맞으면 cnt++하고 리턴, 아니면 다시 탐색하는 식으로 했는데 제출하면 틀렸다고 나옵니다.. 코드를 한번 봐주실수 있으실까요??http://boj.kr/64c5061800704ee4b0e6ab731133f0b4
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
질문 드립니다 !!
저는 check 배열을 사용하지 않고 재귀함수를 탈 때마다 tmp에 포함된 원소를 제외한 배열을 함께 보내서 답을 구하는 식으로 아래 코드를 구현했습니다!!이렇게 구현한다면 강사님의 코드와 비교했을 때 시간이 오래 걸린다던가 하는 문제가 있을까요??function solution(arr, n) { let answer = []; let tmp = Array.from({ length: n }, () => 0); function DFS(L, arr) { if (L === n) { answer.push(tmp.slice()); } else { for (let x of arr) { tmp[L] = x; let duplArr = arr.slice(); duplArr.splice(duplArr.indexOf(x), 1); DFS(L + 1, duplArr); } } } DFS(0, arr); return answer; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
개념강의
안녕하세요 선생님혹시 개념강의는 pdf파일이 없을까요?!