묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
9996번 질문있습니다.
안녕하세요 선생님. 강의 재밌게 잘 보고 있습니다. 틀린 코드http://boj.kr/7087c3d2add44ef5af31cfac7d207cd0 정답 코드http://boj.kr/377c3dd4ad1d4b0eb85986efa78476ba 위 코드에서 틀린 코드를 사용했을 때 틀리는 이유결국 파싱해낸 접두사 / 접미사의 위치가들어오는 문자열의 처음 / 마지막이 아닐 수 있어서 인가요? 해당 상황 예시) [~ [접두사] * ~[접미사][접두사 ~ * [접미사]~][~[접두사] * [접미사] ~] 문제에서 [각각의 파일 이름이 패턴과 일치하는지 아닌지를 구하는 프로그램을 작성하시오]라고 했기 때문에 [접두사*접미사] 형태의 패턴이 입력 문자열의 부분 문자열이 되는 경우에는 파일 이름과 동일하지 않게 되는거고, 만약 문제가[접두사*접미사] 형태의 문자열이 파일 이름 내에 존재하는가?를 묻는다면 위의 로직은 옳게 작동한다고 말할 수 있을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
개념에 대한 질문입니다.
#include "bits/stdc++.h"using namespace std;constexpr int V = 3;int DamageSequence[6][3] = { { 9, 3, 1 }, { 9, 1, 3 }, { 3, 9, 1 }, { 3, 1, 9 }, { 1, 9, 3 }, { 1, 3, 9 } };int visited[64][64][64], scv[3], n;queue<tuple<int, int, int>> q;int BFS(int param1, int param2, int _param3){ visited[_param1][_param2][_param3] = 1; q.push({ param1, param2, _param3 }); while (!q.empty()) { int first = get<0>(q.front()); int second = get<1>(q.front()); int third = get<2>(q.front()); q.pop(); if (visited[0][0][0]) break; for (int i = 0; i < 6; i++) { int nextFirst = max(0, first - DamageSequence[i][0]); int nextSecond = max(0, second - DamageSequence[i][1]); int nextThird = max(0, third - DamageSequence[i][2]); if (visited[nextFirst][nextSecond][nextThird]) continue; visited[nextFirst][nextSecond][nextThird] = visited[first][second][third] + 1; q.push({ nextFirst, nextSecond, nextThird }); } } return visited[0][0][0] - 1;}int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; for (int i = 0; i < n; i++) cin >> scv[i]; cout << BFS(scv[0], scv[1], scv[2]) << "\n"; return 0;}1번째 질문은 일단 이해가 좀 가질 않는 부분은 BFS()를 호출해줄 때 각 SCV의 체력을 인덱스로 하는 지점에서 시작하는부분이 좀 이해가 가질 않습니다.체력을 기준으로 0, 0, 0에서 시작한다고 생각을 했는데 왜 배열의 중간부분부터 탐색을 해나가는지 궁금합니다.2번 째 질문입니다.만약 그게 좌표의 개념이라면 모두가 0이 되는 점 까지의 거리라서 BFS를 진행한 후에 visited의 0,0,0의 값에서 빼 주는 것인지. 좀 추상적으로 이해가 된 것 같아 여쭤봅니다. 오늘도 감사합니다
-
미해결김영한의 실전 자바 - 중급 2편
강의가 너무재밌습니다.
강의가 머리에 쏙쏙들어와서 너무 재밌습니다. 혹시 디자인패턴 강의 내실 생각있으신가요? 다른 디자인패턴강의를 들어본적이 있는데 뭔가 이해하기가 너무힘들더라구요 ㅎㅎ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-A 완탐 시간초과 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.http://boj.kr/32d8365f752d4ea7a3ec61b9ad94f90c안녕하세요 큰돌님. 저의 풀이는 combi 함수가 아닌 원복을 하며 완전탐색으로 풀이를 진행했습니다.하지만 시간초과가 발생하여 어느 부분에서 시간 초과가 발생하는지, 그리고 시간초과가 발생하지 않을 라면 저의 코드에서 어떤 부분을 수정해야 하는지 알 수 있을까요??항상 좋은 강의 해주셔서 감사드립니다 :)
-
미해결자바 코딩테스트 - it 대기업 유제
"이동 횟수" 문제가 변형된다면?
안녕하세요 강사님! 강의 잘 보고 있습니다."이동 횟수"문제에서 모든 물건의 무게가 2kg 이상 5kg이하라는 조건 덕분에 타이타닉 문제와 같이 풀 수 있다는 사실은 이해했습니다. 그런데 혹시 이런 조건이 없고, 한 번에 옮길 수 있는 무게도 임의의 입력값으로 들어와서 정해진다면 정말 어려운 문제가 될 것 같은데, 이런 경우엔 어떻게 문제를 풀이할 수 있을까요? 다이나믹으로 풀 수 있을까 혼자 고민해봤는데 좋은 풀이법이 생각나지 않아 질문드립니다!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
9996번 질문있습니다
#include<bits/stdc++.h>using namespace std;int N; //string input, contrast; //입력할 문자, 대조할 패턴bool YN[104]; //일치 유무string forward_str, back_str; //앞부분 문자열, 뒷부분 문자열int main() { cin >> N; cin >> contrast;; back_str = contrast.substr(contrast.find('*') + 1); forward_str = contrast.substr(0, contrast.find('*')); for (int i = 0; i < N; i++) { cin >> input; if (forward_str == input.substr(0, forward_str.length()) && back_str == input.substr(input.length()- back_str.length(), input.length() - 1)) { YN[i] = 1; } else YN[i] = 0; } for (int i = 0; i < N; i++) { if (YN[i]==1)cout << "DA" << '\n'; else cout << "NE" << '\n'; } return 0;}이렇게 작성하여 컴파일했을때 분명 다 맞게 나왔지만 백준에 제출하면 런타임 에러가 납니다. 무엇이 문제인가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G(9996번) 문제 질문있습니다.
안녕하세요 선생님, 9996번문제 질문 있습니다. 예제는 잘 작동하는데 자꾸 틀립니다. 반례를 최대한 찾으려 했으나 혹시 놓친 반례가 있거나 혹은 로직에서 틀린 부분이 있는지 질문 드립니다.-http://boj.kr/ea0ca29ea51f405e99d1dd110593a3e3
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-F 질문있습니다
#include<bits/stdc++.h>using namespace std;string S;int main(){ getline(cin, S); for (int i = 0; i < S.size(); i++) { if(S[i]>'9') { if(S[i] !=' ') S[i] += 13; if (int(S[i]) > 122 || (90<int(S[i])&&int(S[i])<97)) S[i] -= 26; } } cout << S;}이렇게 코드를 짰는데 Baekjoon Online Judge를 입력하면 Onrxwbba Bayvar W굌trOne is 1을 입력하면 Bar v 1이렇게 출력됩니다.디버그를 해보니 'u'에서 if(S[i] !=' ') S[i] += 13;를 지날때 갑자기 -126이 입력되고 's'에서 -128이 되어버립니다. 무엇이 문제인가요?
-
해결됨코딩테스트 [ ALL IN ONE ]
강의가 계속 검정화면만 나와요
강의가 검정화면으로만 나오고 소리만 나옵니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
반례 질문 좀 드리고 싶습니다.
죄송합니다. 반례를 도저히 모르겠습니다.http://boj.kr/b03daff7be7b471091653480f1cd380f 도저히 모르겠어서 그냥 다시 짜서http://boj.kr/808e04c0dc7a48b4ba377150b039c7d7이렇게 하니 또 패스되더라구요. 둘의 차이를 전 모르겠습니다.... 한번 부탁드려도 될까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
수업노트 관련 질문있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요.이번 수업노트의 아래부분에서 궁금한점이 있어서 질문드립니다.코드가 수정되었습니다.void go(int here){ if(here == n){라고 언급해주셨는데, 이 부분이만약 n이 3인 상황에 here == n 코드 기준으로위 사진 처럼go(1) -> go(2) -> go(3) 까지 호출되어서 go(3) 총 4번 호출되게 되는데요, 이러면 1번째 행과 2번째 행에대한 반전/비반전 경우의 수가 2*2 = 4만이 고려되었다고 생각합니다. 따라서 기존 코드인 here == n +1 을 기준으로 본다면go(1) -> go(2) -> go(3) -> go(4) 까지 호출되어서 go(4)가 총8번 호출되게 되는데요, 이래야 1,2,3(n = 3)행의 비반전/반전의 경우의 수인 2*2*2=8가지의 경우의 수가 고려된것이 아닌지 궁금합니다..
-
해결됨김영한의 실전 자바 - 중급 2편
Comparator질문입니다
public class SortMain2 { public static void main(String[] args) { Integer[] arr = {3,2,1}; System.out.println(Arrays.toString(arr)); System.out.println("Comparator 비교"); Arrays.sort(arr,new AscComparator()); System.out.println("AscComparator:"+Arrays.toString(arr)); } } public class AscComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { if(o1 > o2){ return 1; } else if (o1 == o2) { return 0; }else return -1; } }SortMain2함수에서 Arrays.sort(arr,new AscComparator()); 부분에서 new AscComapator()로 객체만 생성했는데 어떻게 compare함수까지 호출되서 비교를 할수있는거죠?이해가안갑니다...함수 호출을안해는데..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
연속해서 자음, 모음을 구하는거에서 저는 단순하게 풀었는데
http://boj.kr/2a16a22c3a174c32bb1a46a3157072b5 제 코드입니다. 저는 너무 주먹구구식으로 생각하는 것 같은데.알고리즘으로 푸는 문제가 아닌 상황을 해결해야 하는 문제를 직면하게 되면 제 코드를 보시다시피 너무 주먹구구식으로 생각하는 경향이 있는 것 같습니다.선생님처럼 우아한 코드를 쓰고 싶은데 어떻게 생각을 늘려야 할까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 질문있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요.- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. if (y == 0 || x == 0 || y == r - 1 || x == c - 1) {ret = person_check[y][x];break;}여기서 그냥 ret에 저장하고 break를 하셨는데.. 저는 min으로 계속 비교 해야한다고 생각했거든요.. dfs처럼 재귀함수가 아니고 q에 들어온 순서대로 저장이 되고.. 가장 먼저 가장자리에 들어가게 되서 그냥 break로 끝내는 걸까요..? 저는 계속 생각해도 다른 가장자리에 더 최소로 갈 수 있을 것 같은데..ㅜ if (y == 0 || x == 0 || y == r - 1 || x == c - 1) {그리고 저는 이 if 문이 for (int i = 0; i < 4; i++) {int ny = y + dy[i];int nx = x + dx[i]; for문 안에 있어야 된다고 생각했는데.. for문에서 불보다 가까운지, 넘어가지는 않는지 이런걸 pass해야 해서 그런걸까요? 코드를 아래처럼 했는데 똑같은 것 같은데 틀렸다고 나옵니다..ㅜ#include <bits/stdc++.h>using namespace std;const int INF = 987654321;char a[1004][1004];int r, c, sx, sy, ret, y, x;int dy[] = { -1, 0, 1, 0 };int dx[] = { 0, 1, 0, -1 };int fire_check[1004][1004], person_check[1004][1004];int main() { cin >> r >> c; queue<pair<int, int>> q; fill(&fire_check[0][0], &fire_check[0][0] + 1004 * 1004, INF); //memset(fire_check, INF, sizeof(fire_check)); for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { cin >> a[i][j]; if (a[i][j] == 'F') { fire_check[i][j] = 1; q.push({ i,j }); } if (a[i][j] == 'J') { sy = i; sx = j; } } } while (q.size()) { tie(y, x) = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= r || nx < 0 || nx >= c) continue; if (fire_check[ny][nx] != INF || a[ny][nx] == '#') continue; fire_check[ny][nx] = fire_check[y][x] + 1; q.push({ ny, nx }); } } person_check[sy][sx] = 1; q.push({ sy, sx }); while (q.size()) { int y = q.front().first; int x = q.front().second; //tie(y, x) = q.front(); q.pop(); if (y == 0 || x == 0 || y == r - 1 || x == c - 1) { ret = person_check[y][x]; break; } for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= r || nx < 0 || nx >= c) continue; if (person_check[ny][nx] || a[ny][nx] == '#') continue; if (fire_check[ny][nx] <= person_check[ny][nx] + 1) continue; person_check[ny][nx] = person_check[y][x] + 1; q.push({ ny, nx }); } } if (ret != 0) cout << ret; else cout << "IMPOSSIBLE \n";}
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-A 질문있습니다.
제 방식대로 풀었을 떄 왜 틀렸는지 잘 모르겠어서 질문 남겨요#include <bits/stdc++.h> using namespace std; int arr[9]; vector<int> v; // 9명중 7명 선택 // 키의 합 100 // 키가 주어 졌을 때 일곱 난장이 찾기 // 키를 오름차순으로 출력하기 bool Check() { int sum = 0; for (int a : v) sum += a; if (sum == 100) return true; return false; } void Print() { vector<int> ret = v; sort(ret.begin(), ret.end()); for (int a : ret) cout << a << '\n'; } void Combi(int start) { if (v.size() == 7) { if (Check()) Print(); return; } for (int i = start + 1; i < 9; i++) { v.push_back(arr[i]); Combi(i); v.pop_back(); } } int main() { // input for (int i = 0; i < 9; i++) cin >> arr[i]; // 9명중 7명 선택 Combi(-1); return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-A: 맞왜틀 질문
안녕하세요 선생님.#2178 문제 중, 질문이 있습니다.사실 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 를 습관처럼 사용했습니다.코드 실행 성능을 늘릴 수 있다는 생각 하에 아무생각없이 넣었었는데요.#2178 문제의 경우 이 코드 라인 존재 유무에 따라 정답 오답 차이가 발생하게 되었습니다.정답코드: http://boj.kr/a38836f77c014af59c41c4d52b8416bc오답코드: http://boj.kr/b698e25e27b84232901cd3ee8f0dc037정답/오답의 판별이 아래 코드의 존재 유무에 기인한 것인지, 아니면 다른 부분에 있는 것인지 질문 드립니다.int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); ... }
-
해결됨세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
제 학습방법이 맞는지 궁금합니다..
만약 강의보기전에 알고리즘 문제 풀 때, 아무것도 쓰지 못할 경우에는일단 어떻게 접근할지 생각해본다 (한 자라도 쓸 수 없더라도) 강의를 본다. 모르는 개념이 나왔을때, 따로 공부하고 코드를 계속 외울때까지 써본다.이런 방식으로 해도 괜찮을까요??
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
Section 10. 동전교환 반례
32 3 51 테스트케이스를 위와 같이 입력할 경우 정답 코드대로 하면 Intger.MAX_VALUE인 2147483647이 답으로 나올 것 같아서요. 이렇게 추가코드를 넣어야 하는것 아닌지 궁금합니다. import java.util.*; class Main{ static int n, m; static int[] dy; public int solution(int[] coin){ Arrays.fill(dy, Integer.MAX_VALUE); dy[0]=0; for(int i=0; i<n; i++){ for(int j=coin[i]; j<=m; j++){ dy[j]=Math.min(dy[j], dy[j-coin[i]]+1); } } /* 추가코드 for (int i = 0; i <= m; i++) { if (dy[i] == Integer.MAX_VALUE) { dy[i] = 0; } } */ return dy[m]; } public static void main(String[] args){ Main T = new Main(); Scanner kb = new Scanner(System.in); n=kb.nextInt(); int[] arr=new int[n]; for(int i=0; i<n; i++){ arr[i]=kb.nextInt(); } m=kb.nextInt(); dy=new int[m+1]; System.out.print(T.solution(arr)); } }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-P 질문
안녕하세요 큰돌님.항상 강의 잘듣고 있습니다! http://boj.kr/9b11458d7099479e944bd68a0403eb44문제를 풀고 영상을 확인하였는데 큰돌님이랑 풀이 방식이 조금은 다르지만 전반적인 흐름은 비슷하다고 생각이 되는데 왜 제대로 동작하지 않는지 도저히 해결이 안돼서 질문 드립니다.. ㅠ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-A 질문있습니다 :)
안녕하세요 선생님 🙂 전체적인 로직은 이해가 가지만 이해가 되지 않는 부분이 있어서 질문 드립니다. 강의에서도 설명해주셨지만 if (pq.size() > vec[i].first) 이 부분이 부분적으로 이해가 되지 않습니다. 선생님의 로직과 문제의 예제를 보면 1일 강의가 2개가 있고 2일 강의가 2개가 있기 때문에 1일 강의와 2일 강의에서 가장 큰 페이를 가진 강의를 1개씩 선택할 수 있으며, 3일 강의는 1개이기 때문에 3일까지 문제없이 풀이가 되는 것까지는 이해를 했습니다. 예제에서 존재하는 날짜는 1, 2, 3, 10, 20인데요, 3일에서 10일로 한번에 7일을 건너뛰었습니다.pq.size()= 3인 상태에서 vec[i].first = 10이 될 것으로 예상되는데요, 만약에 10일 강의가 2개있다면 pq.size() = 4이기 때문에 pq.pop()연산이 발생하지 않을 것이기에 문제풀이에 지장이 생길 것이라고 생각하고 있습니다. 테스트케이스를 만들어서 입력해봤을 때는 문제가 없었지만.. 왜 문제없이 풀이가 되는지 알려주시면 감사하겠습니다 :)