묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
이메일 남겨드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 원격으로 부탁드립니다...이메일 전달드립니다.lahatko1202@gmail.com감사합니다.0
-
미해결제주코딩베이스캠프 Code Festival: JavaScript 100제
71번 깊이 우선 탐색 질문드립니다.
안녕하세요. 71번 문제의 출력엔 E D F A C B로 되어 있습니다. 그 앞에 깊이 우선 탐색을 그림으로 해설 하실때에도 E D F A C B로 설명해주시는데 하지만 정답 코드로는 E A B C D F 로 나오는데 해설에는 단지 출발 방향만 다르지 같다고 하시는데 이해가 되질 않아 문의드립니다.
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
백준 실행시 틀립니다.
안녕하세요 강사님. 문제를 풀고 백준에 제출했을 때 계속 오답으로 나와 질문 드립니다..제가 봤을 때 강사님 코드랑 거의 비슷하게 수정까지 한 것 같은데.. 어떤 부분이 잘못되었는지 확인 한번 부탁드립니다.import java.io.*; import java.util.StringTokenizer; public class Main { final static int MAX = 50 + 10; static boolean map[][]; static boolean visited[][]; /* static int dirY[] = {1, 1, 1, 0, 0, -1, -1, -1}; static int dirX[] = {-1, 0, 1, -1, 1, -1, 0, 1};*/ static int dirY[] = {-1, -1, 0, 1, 1, -1, 0, -1}; static int dirX[] = {0, 1, 1, -1, 0, -1, -1, -1}; static int N, M; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); while (true) { StringTokenizer st = new StringTokenizer(br.readLine()); M = Integer.parseInt(st.nextToken()); // 너비 x N = Integer.parseInt(st.nextToken()); // 높이 y if (N == 0 && M == 0) break; map = new boolean[MAX][MAX]; visited = new boolean[MAX][MAX]; // 1. map 정보 반영 for (int i = 1; i <= N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 1; j <= M; j++) { map[j][i] = Integer.parseInt(st.nextToken()) == 1; } } // 2. dfs int result = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { if (map[i][j] && !visited[i][j]) { dfs(i, j); result++; } } } // 3. 출력 bw.write(String.valueOf(result)); bw.newLine(); } bw.close(); bw.close(); } private static void dfs(int y, int x) { visited[y][x] = true; for (int i = 0; i < 8; i++) { int newY = dirY[i] + y; int newX = dirX[i] + x; if (map[newY][newX] && !visited[newY][newX]) { dfs(newY, newX); } } } }
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
문자열 슬라이싱
안녕하세요, 문자열 슬라이싱 관련 질문이 있습니다.문자열 a = 'abcde'가 있다고 할 때, print(a[::-1]) 을 실행하면 'edcba'로 문자열이 반대로 나오지만print(a[1:4:-1])처럼 [ : :-1]에서 시작하는 칸과 끝나는 칸에 그 어떤 수를 넣어도프린트가 되지 않습니다.유사하게 -1대신 -2, 등 음수는 되지 않는다는 것을 확인하였습니다.print(a[1:4:2])는 되는데 print(a[1:4:-1])이 되지 않는 이유는 무엇인가요?[ : : ] 에서 마지막에 음수를 넣으면 그 앞 두 칸에는 숫자를 넣을 수 없는 것인가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
시간초과 관련 질문 드립니다.
안녕하세요 선생님,http://boj.kr/748e160790bc4f178f9f9ec8afbd0054테스트 케이스는 통과했지만, 시간 초과가 떴습니다. 선생님의 코드와 비교했을 때, 대충 제 코드의 'find' 함수에서 맵 순회 부분이 매우 비효율적이라는 것 정도를 짐작할 수 있었습니다. 다만, 확실히 짚고 넘어가고 싶어 이렇게 질문을 드립니다.아래의 두 코드에서 시간복잡도 측면에서 어떤 차이가 있는지, 왜 선생님의 코드가 더 빠른지 정확히 알고싶습니다.위가 제 코드이고, 아래가 선생님의 코드입니다. 1. 제 코드는 특정 값을 찾기위해 모든 맵을 순회하고 있는데, 선생님처럼 코드를 짜면 특정 값을 찾기위해 맵을 순회할 필요가 없나요? 2. 제 코드는 모든 맵을 순회하면서 맵의 first값, second 값 모두를 비교합니다. 이부분도 시간복잡도가 커질 수 있는 여지가 있나요? 혹시 시간초과가 난 다른 이유가 있다면 알려주시면 감사하겠습니다!좋은 강의 늘 감사합니다:)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-F MAX 처리에 대한 질문
int go(int index, int k, int mask) { if (k < 0) return 0; if (index == 26) return count(mask); int ret = go(index+1, k-1, mask | (1 << index)); if (index != 'a'-'a' && index != 'n'-'a' && index != 't'-'a' && index != 'i'-'a' && index != 'c'-'a') { ret = max(ret, go(index+1, k, mask)); } return ret;}위 GO함수 내에서 마스킹할때는 ret에 max 처리를 하지 않았는데 마스킹하지 않을 경우에 ret에 max처리를 하신 이유가 궁금해서 질문드립니다! 어떠한 차이가 있는건지 잘 이해가 안가네요 ㅜㅜ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-E 뮤탈리스크 질문있습니다.
뮤탈리스크 문제를 아래의 논리로 해결하는 코드를 작성했습니다. 예제는 전부 통과했는데, 왜 제출하면 답이 틀리는 지 잘 모르겠습니다.논리scv 체력의 합이 1 이상이면 뮤탈은 공격해야 한다.scv 체력을 내림차순으로 정렬한다.체력이 높은 scv 순으로 9,3,1 데미지를 입힌다.데미지를 입어 체력이 0 미만이면, 0으로 체력을 재조정한다.scv의 체력을 합한다.위의 과정을 반복하면서 횟수를 센다.코드http://boj.kr/5dd90a26a8b24bb797b6bcffcde65bba
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
지역변수 질문이요
안녕하세요 강의 잘 듣고있습니다혹시 int cnt=0을 for(i)반복문 밑에 선언한것은 j,k 반복문이 끝나고 cnt를 0으로 초기화 하실려고 저 위치에 선언한게 맞으실까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
제 코드에서 어디가 잘못된 지 잘 모르겠습니다
안녕하세요 선생님, 강의 잘 듣고 있습니다.선생님 덕분에 코딩의 즐거움을 느끼고 있습니다. http://boj.kr/bbbe4b5ba1ae4d06a05d057e9dfbc3d0제가 작성한 코드인데, 테스트 케이스에 있는 입력값을 돌려보면 17, 63 이라는... 터무늬 없는 숫자가 나옵니다. 주석 처리된 부분을 통해 headgear, eyewear, face 의 갯수까지는 잘 들어온 것을 확인할 수 있었는데 그 이후, ans 에 map의 값을 순차적으로 곱해나가는 부분에서 문제가 있는 것 같습니다. 하지만 아직까지 어떤 부분에서 코딩을 잘못한건지 찾고있지 못하여 선생님께 질문을 드리게 되었습니다. 다시한번 좋은 강의 늘 감사드립니다.
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
2강 14분쯤 문제 2번 14232번 출력초과...
자꾸 출력초과가 나요..vscode에서 돌려보면 맞는 출력값이 나오는데왜 백준에서는 출력초과가 나는지 모르겠어요 ...강의에 있는 코드 참고해서 한건데 왜 안되는지 모르겠어요 ㅠ........ n = int(input()) jewel = [] for i in range(1,int(n**0.5)+1): if i >2 : if n%i == 0: jewel.append(i) jewel.append(n//i) jewel.sort() print(len(jewel)) print(' '.join(map(str,jewel)))
-
미해결Do it! 알고리즘 코딩테스트 with C++
백주 1456번
for (int i = 2; i <= 10000000; i++) { if (num[i] != 0) { long long temp = num[i]; while ((double)num[i] <= (double)B/(double)temp && (double)num[i] >= (double)A / (double)temp) { count++; temp = temp * num[i]; } } }풀이와 다르게 while 문에서 min값까지 판단하게되면 왜 답이 달라지는건지 모르겠습니다.어떤 값을 count 못하게 되는건지 모르겠습니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
map을 2개 사용하는 방식이 좋은지 이 방식이 좋은지 궁금하여 질문드립니다!
소스 코드http://boj.kr/d754f100ea9f49e6b9f3bd0c8f1ec98a저는 map을 <int, pair<int, int>>의 형식으로 사용했는데요, first에는 key, second.first에는 빈도수, second.second에는 입력 순서가 저장됩니다. 강의를 보기 전 문제를 풀어 보았는데 이러한 방식으로 구현하는 것이 map을 2개 사용하는 것보다 효율적일까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-R 질문합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 큰돌님.<1번 코드>#include <iostream> #include <vector> using namespace std; int n, root, del, visited[53], cnt; vector<int> v[53]; bool isLeaf; void dfs(int n){ visited[n]= 1; isLeaf=true; for(int i : v[n]){ if(!visited[i] && i != del){ //방문하지 않았고 현재 i가 del이랑 다르면 dfs를 계속 호출해서 탐색해야 함 isLeaf = false; dfs(i); } } if(isLeaf){ cnt++; } } int main(){ cin >> n; int num; for(int i=0; i<n; i++){ cin >> num; if(num == -1){ root = i; }else{ v[num].push_back(i); } } cin >> del; if(del == root){ cout << 0 << "\n"; }else{ dfs(root); cout << cnt << "\n"; } return 0; }#include <iostream> #include <vector> using namespace std; int n, root, del, visited[53], cnt; vector<int> v[53]; void dfs(int n){ visited[n]= 1; bool isLeaf = true; //가지마다 체크해야하니까 for(int i : v[n]){ if(!visited[i] && i != del){ //방문하지 않았고 현재 i가 del이랑 다르면 dfs를 계속 호출해서 탐색해야 함 isLeaf = false; dfs(i); } } if(isLeaf){ cnt++; } } int main(){ cin >> n; int num; for(int i=0; i<n; i++){ cin >> num; if(num == -1){ root = i; }else{ v[num].push_back(i); } } cin >> del; if(del == root){ cout << 0 << "\n"; }else{ dfs(root); cout << cnt << "\n"; } return 0; } 처음에 첫번째 코드로 작성하여 리프 노드의 갯수가 제대로 출력되지 않았습니다. isLeaf라는 변수의 선언 위치에 따라 값이 달라지는데 왜 두 코드가 값이 다르게 나오는지 모르겠습니다..
-
해결됨Do it! 알고리즘 코딩테스트 with C++
백준 1325, 교재 47번 문제 질문입니다.
교재에서는 bfs로 구현했는데 저는 dfs로 구현해봤습니다.그랬더니 시간초과가 발생했네요. 제가 작성한 코드가 올바른답이긴하지만 시간초과가 발생하는건지, 아니면 그냥 틀린건지 궁금합니다. 또한 올바른답 이맞다면 왜 시간초과가 발생하는지(시간복잡도 차이가 왜 크게 나는지)도 궁금합니다. #include <iostream>#include <vector>#include <queue>using namespace std;int maxdepth=-1;vector<vector<int>> a;vector<bool> visited;void dfs(int k, int depth);int main() {ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);int n,m;cin >> n >> m;a.resize(n + 1);visited = vector<bool>(n + 1, false);for (int i = 0; i < m; i++) {int s,e;cin >> s >> e;a[e].push_back(s);}vector<int> result(n + 1, 0);for (int i = 1; i <= n; i++) {dfs(i, 0);result[i] = maxdepth;maxdepth = -1;fill(visited.begin(), visited.end(), false);}int realmax = -1;for (int i = 1; i <= n; i++) {if (result[i] > realmax)realmax = result[i];}for (int i = 1; i <= n; i++) {if (realmax==result[i])cout<<i<<' ';}}void dfs(int k, int depth) {if (maxdepth < depth)maxdepth = depth;visited[k] = true;for (int i : a[k]) {if (!visited[i]) {dfs(i, depth + 1);}}visited[k] = false;}
-
해결됨코딩테스트 [ ALL IN ONE ]
LCA 문제 관련해서 질문이 있습니당
꼭 visited 배열에 값을 넣거나 혹은 값을 print 하는 것이 아니고 이번 LCA 문제처럼 값을 return 해주는 것도 트리를 순회하다가 방문 처리를 했다고 이해해도 될까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
bfs 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 큰돌 선생님 이번 정답 코드를 보고 의문점이 생겨서 게시글을 남깁니다! 저번 G-12851 문제에서 trace만 추가된것이 이번 H-13913 문제인데 저번 G번 문제 같은 경우 bfs를 이용한 해설코드가 다음과 같았습니다.그런데 이번 H 문제에서는 이렇게 짜셨는데 G번 문제에서는 here==k 일 때 break를 걸지 않고 H문제에서는 걸어도 되는 이유는 정확히 모르겠습니다.. 혼동이 오네요 또한 G번 문제에서 H문제 처럼 here==k 라는 조건 즉, 동생을 찾았다는 조건이 없으면 동생의 위치를 찾아도 계속 bfs가 돌아서 시간적으로 더 소모가 되는게 아닌가요...?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
9996번 문제 질문입니다!
예제도 다 맞고 질문게시판에 반례들도 다 넣어서 옳게 출력된 거 같은데 런타임 에러가 납니다ㅠㅠ뭘 빼먹었을까요?http://boj.kr/e808a1c39cc74954a63f14721dc3dce3
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-a
// Online C++ compiler to run C++ program online #include <bits/stdc++.h> using namespace std; //// 다이어트 int N,mp,mf,ms,mv; int resultSet; vector<int> resultSetVector; typedef struct food{ int v[5]; }food; food* input(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>N>>mp>>mf>>ms>>mv; food* fList = (food*) malloc(sizeof(food) * N); for(int i=0; i<N; i++){ for(int j=0; j<5; j++){ cin >> fList[i].v[j]; } } return fList; } void printBitSet(int resultSet, int N){ for(int i=0;i<N; i++){ if( resultSet & (1<<i) ) { cout << i + 1 << " "; } } } //// logic // 1. 모든 조합을 구한다. // 2. 해당 조합 중에 최소 영양소 기준을 만족하는 조합을 찾는다. // 3. 해당 조합 중 최소 비용 조합을 찾는다. void solve(){ food* fList = input(); int result = INT_MAX; for(int i=0; i<(1<<N); i++){//O(N^2) //1. int sum[5] = {0}; for(int j=0;j<N;j++){ if(i&(1<<j)){ sum[0] += fList[j].v[0];//pi sum[1] += fList[j].v[1];//fi sum[2] += fList[j].v[2];//si sum[3] += fList[j].v[3];//vi sum[4] += fList[j].v[4];//ci } } //2.mp,mf,ms,mv if(sum[0] >= mp && sum[1] >= mf && sum[2] >= ms && sum[3] >= mv){ //3. if(result >= sum[4]){ result = sum[4]; resultSet = i;//최소 비용 조합 } } } if(result == INT_MAX) cout << -1 << '\n'; else{ cout << result << "\n"; printBitSet(resultSet, N); } } int main(){ solve(); } void printBitSet(int resultSet, int N){ for(int i=0;i<N; i++){ if( resultSet & (1<<i) ) { cout << i + 1 << " "; } } ////..... //2.mp,mf,ms,mv if(sum[0] >= mp && sum[1] >= mf && sum[2] >= ms && sum[3] >= mv){ //3. if(result >= sum[4]){ result = sum[4]; resultSet = i;//최소 비용 조합 } } ////..... if(result == INT_MAX) cout << -1 << '\n'; else{ cout << result << "\n"; printBitSet(resultSet, N);//최소 비용 조합 출력 }} 안녕하세요 큰돌 님. 비트마스킹 문제 질문이 있어 여쭤봅니다. 어떤 반례가 있을지 궁금합니다. vector에 넣어주는 방식이 아니라, i 비트값을 업데이트 해서 프린트 해주는 방식으로 구현 했습니다.위 방식만 다르기 때문에 여기서 문제가 있을 거라 추측됩니다.12퍼센트 쯤에서 테케통과를 못 하더라구요ㅠ 도와주시면 정말 감사드리겠습니다. 공유 소스 보기 (acmicpc.net)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-d 오답 질문드립니다.
// Online C++ compiler to run C++ program online #include <bits/stdc++.h> using namespace std; // 입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. typedef pair<int,int> pp; int R,C; int visited[1004][1004]; char cmap[1004][1004]; int fmap[1004][1004]; int dx[4] = {0,0,1,-1}; int dy[4] = {-1,1,0,0}; //pp start; queue<pp> q; queue<pp> fq; bool outOfBound(int y, int x){ return (y < 0 || x < 0 || y >= R || x >= C ); } bool isExit(int y, int x){//탈출구 return (y == 0 || x == 0 || y == R - 1 || x == C -1); } bool isWall(int y, int x){ return cmap[y][x] == '#'; } void input(){ // 초기화 fill(&fmap[0][0],&fmap[0][0] + 1004 * 1004 , INT_MAX ); cin >>R>>C; for(int i=0;i<R;i++) for(int j=0;j<C;j++){ cin >> cmap[i][j]; if(cmap[i][j] == 'F'){//fire then fmap[i][j] = 1; fq.push({i,j}); } if(cmap[i][j] == 'J'){//출발 지점 q.push({i,j}); visited[i][j] = 1; } } } //bfs int solution(){ int y,x; int ny,nx; //bfs fire while(!fq.empty()){ tie(y,x) = fq.front(); fq.pop(); for(int i=0; i<4; i++){ ny = y + dy[i]; nx = x + dx[i]; if( fmap[ny][nx] != INT_MAX ) continue; //visited if(isWall(ny,nx) || outOfBound(ny,nx)) continue; fq.push({ny,nx}); fmap[ny][nx] = fmap[y][x] + 1; } } //bfs person while(!q.empty()){ tie(y,x) = q.front(); q.pop(); if(isExit(y,x)){ return visited[y][x]; } for(int i=0; i<4; i++){ ny = y + dy[i]; nx = x + dx[i]; if(visited[ny][nx] || isWall(ny,nx) || outOfBound(ny,nx)) continue; if(fmap[ny][nx] <= visited[x][y] + 1) continue; //이미 불이 있는 지역 q.push({ny,nx}); visited[ny][nx] = visited[y][x] + 1; } } return -1; } //solve void solve(){ input(); int result = solution(); if(result == -1) cout << "IMPOSSIBLE"; else cout << result; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); } bool outOfBound(int y, int x){ return (y < 0 || x < 0 || y >= R || x >= C ); } bool isExit(int y, int x){//탈출구 return (y == 0 || x == 0 || y == R - 1 || x == C -1); } bool isWall(int y, int x){ return cmap[y][x] == '#'; } 2% 오답 처리가 나는데 도저히 모르겠습니다. ㅠㅠ 위로 뺀 bool 컨디션 체크에서 문제가 생겼을 수도 있을 거 같은데.. 로직 구조가 해답과 거의 유사해서 어디서 문제가 생겼는지 디버깅 해도 안 보이네요 ㅠㅠ.. 그리고 ######J#F###..##...##...# 원본 반례 찾아보다가 시험 해본 케이슨데 해설지 답에서 걸러내지 못하는 것 같습니다. 코테 너무 어려워요 ㅠㅠㅠ 4179번: 불! (acmicpc.net)
-
미해결IT 기업 취업을 위한: 코딩테스트 혼자서 정복하기 (C/C++)
이해가 안되는 부분이 있습니다.
안녕하세요 선생님 질문이 하나 있습니다. dp(6-5) = dp(1)이고 dp(6-3)은 dp(3)을 나타내고이제 6번째 배열에서 Min(dp(1)+1, dp(3)+1)에서 최소값은 왼쪽 dp(1)+1이 아닌가요? 왜 dp(3)+1로 된건지 이해가 안갑니다. 대괄호가 기입이 안돼 소괄호로 대체합니다.