묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
연결요소의 개수 구하기(백준11724) 질문
DFS 함수 구현 부분에서 if(visited[v]){ return; } 처럼 탈출 조건을 사용하는 이유가 무엇인가요? 재귀를 시작하기전에 조건문으로 visited가 false일때만 시작하도록 설정했으니 필요없는 부분이 아닌가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
split함수 작성시 질문
input.erase(0, pos+delimeter.length()); 대신input.erase(0, pos+delimeter.size()); 로 써도 무방한가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 질문입니다..
2일째 고민을 해보았는데..2%까지만 맞고 틀리다고 합니당..ㅠㅠ포기하고 싶지 않은 마음에 도움을 요청합니다!!제가 짠 코드는 이렇습니다!import java.io.*; import java.util.*; // 불이 하나가 아닌 여러개일 수 있다. public class Main { public static int R; public static int C; public static String[][] map; public static int[][] visitedFire; public static int[][] visitedHuman; public static int[] dx; public static int[] dy; public static Node fireLocation; public static Node humanLocation; public static Queue<Node> fireQueue; public static void main(String[] args) throws IOException { // 초기화 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); map = new String[R][C]; // 0으로 초기화 visitedFire = new int[R][C]; visitedHuman = new int[R][C]; dx = new int[]{0,1,0,-1}; dy = new int[]{-1,0,1,0}; fireQueue = new LinkedList<>(); // 맵 입력 for (int i = 0; i < R; i++) { String S = br.readLine(); for (int j = 0; j < C; j++) { // 불 좌표, 지훈이 좌표 찾기 map[i][j] = String.valueOf(S.charAt(j)); if(map[i][j].equals("J")){ humanLocation = new Node(j,i); map[i][j] = "."; // .으로 변경 }else if(map[i][j].equals("F")){ // 불이 여러개, 불이 아무것도 없을 수 있다. -> 반레 fireLocation = new Node(j,i); fireQueue.add(fireLocation); visitedFire[i][j] = 1; } } } // (1) 불이 이동할 수 있는 최단경로 fireBfs(); // (2) 사람이 이동할 수 있는 최단경로 + 길 비교해야함 humanBfs(humanLocation.y, humanLocation.x); // 가능한 길 찾아서 int result = Integer.MAX_VALUE; // (3) 가장 짧은 최단거리 찾기 (가장자리 찾기) for (int i = 0; i < visitedHuman.length; i++) { for (int j = 0; j < visitedHuman[i].length; j++) { if((0<i && i<R-1) && 0 < j && j < C-1)continue; // 가장자리가 아닌 경우 pass if(visitedHuman[i][j] > 0) { result = Math.min(result, visitedHuman[i][j]); } } } if(result == Integer.MAX_VALUE){ System.out.println("IMPOSSIBLE"); }else{ System.out.println(result); } } public static void humanBfs(int y, int x){ // tkfk visitedHuman[y][x] = 1; Node node = new Node(x,y); Queue<Node> queue = new LinkedList<>(); queue.add(node); while(queue.size()>0){ Node cur = queue.poll(); for (int i = 0; i < 4; i++) { int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue; if(visitedHuman[ny][nx] == 0 && (map[ny][nx].equals("."))){ if(visitedHuman[ny][nx] < visitedFire[ny][nx] || visitedFire[ny][nx] == 0){ visitedHuman[ny][nx] = visitedHuman[cur.y][cur.x] + 1; Node next = new Node(nx,ny); queue.add(next); } } } } } public static void fireBfs(){ while(fireQueue.size()>0){ Node cur = fireQueue.poll(); for (int i = 0; i < 4; i++) { // 4방향 탐지 int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue; if(visitedFire[ny][nx] == 0 && (map[ny][nx].equals("."))){ visitedFire[ny][nx] = visitedFire[cur.y][cur.x] + 1; // 이동함을 표현 Node next = new Node(nx,ny); fireQueue.add(next); } } } } public static class Node { int x; int y; Node(int x, int y){ this.x = x; this.y = y; } } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
맵과 방향벡터 퀴즈 질문있습니다
안녕하십니까 큰돌님Q. 3 * 3 맵을 입력받아야 함. 이 맵은 1과 0으로 이루어져있고 {0, 0}은 무조건 1임을 보장한다. {0, 0}부터 4방향을 기준으로 한칸씩 탐색해나가며 방문한 정점은 다시 방문하지 않으며 방문하는 좌표를 출력하는 코드. 0은 갈 수 없는 지역. 1은 갈 수 있는 지역을 구현하시오.1. 문제의 뜻이 {0, 0}을 기준으로 4방향으로 탐색하는데 다 0이면 그 다음 칸인 {0, 1}로 이동하는데 0이니까 그 다음 칸인 {0, 2}를 기준으로 4방향을 탐색하는데 밑에 1이 있으니까 {1, 2}를 기준으로 또 4방향으로 탐색하고~, 이렇게 하라는 뜻이 아닌 거죠 ??저는0 : 01 : 00 : 21 : 22 : 22 : 1이렇게 출력되게 해야하는 줄 알았는데 위 문제의 답 코드를 실행시키면0 : 01 : 0이렇게 나와서 제가 이해력이 안 좋아서 질문드립니다 ㅎ dfs까지 추가로 강의를 들었는데 위 퀴즈의 go 함수 로직이 사실 dfs 로직인 건가요 ??종화는 방구쟁이야! 문제의 dfs 로직과 위 퀴즈의 go 함수 로직과 거의 유사해보여서요 ) 트리 순회의 조건문 visited[here] == 0 안의 로직에서 중위 순회에서만 else-if 문을 사용하는데 http://boj.kr/9ed45ee550c0492081f5cbd187a7c71d 이런식으로 전위, 후위에서도 자식 노드가 한 개 아니면 두 개 둘 중에 하나니까 두 번 if문 볼 필요없게 else-if문 사용해도 되는거죠 ??
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
인접리스트 기반 탐색 코드 질문있습니다
안녕하십니까 큰돌님인접행렬 때의 코드와 인접리스트 코드까지만 공부하고 퀴즈를 풀기 전에 작성했던 코드인데 깔끔하지는 않은데 1 2 3 4 출력은 잘 돼서 틀린 로직은 아닌 건가요 ?? http://boj.kr/72b4a1f671414e30a599594cfaf2bb84
-
해결됨자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
정규식 match 사용해서 풀었습니다.
function solution(str = '') { return str .match(/(.)\1*/g) .map((word) => word.charAt(0) + (word.length > 1 ? word.length.toString() : '')) .join('') } let str1 = 'KKHSSSSSSSE' console.log(solution(str1))정규식 사용해서 풀이해보았습니다.이상 없을까요? 그리고 문자열 강의를 대부분 보았는데정규식은 따로 다루시는 것 같지 않아서 조금 아쉽습니다.나중에라도 강사님께서 정규식에 대해 소개해주시면 어떨까 해서 글 남겨 봅니다.강사님께서는 현업에도 종사하시고, 수강생들보다 문제풀이 경험이 많으실테니 어떤 정규식들을 많이 보셨는지 궁금합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
출력 관련해서 질문드려요~
#include <bits/stdc++.h> using namespace std; int n, m, y, x, toX, toY, nx, ny; int arr[104][104]; int visited[104][104]; queue<pair<int,int>> q; int dx[4] = {0,1,0,-1}; int dy[4] = {-1,0,1,0}; int main() { cin.tie(NULL); cout.tie(NULL); cin >> n >> m; cin >> x >> y; cin >> toX >> toY; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> arr[i][j]; } } visited[x][y] = 1; q.push({x, y}); while (q.size()) { tie(x, y) = q.front(); cout << x << y << "\n"; q.pop(); for (int i = 0; i < 4; i++) { nx = x + dx[i]; ny = y + dy[i]; if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue; if (arr[nx][ny] == 1 && !visited[nx][ny]) { visited[nx][ny] = visited[x][y] +1; q.push({nx,ny}); } } } printf("%d\n", visited[toX][toY]); cout << visited[toX,toY]; return 0; }안녕하세요 printf로 출력을 했을때는 9가 잘 뜨는데 왜 cout을 하면 주소값(0x415fc0)이 뜨는지 이유를 알 수 있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
공부방법에 대해 질문이 있습니다
알고리즘공부를 어느정도는 예전에 해본 수강생입니다다만 c++에대한 기본지식이 선생님이 올려주신 교안을 살펴보니 모자른점이 있어 교안을 보면서 공부를 해보고있습니다.딱 백준기준으로 골드초입정도인 dfs/bfs같은 문제까진 계속 풀어오긴했는데 비트마스킹이나 정규식 문자열파싱등 제게 모자르던 기초부분이있다는걸 교안을통해 배우게되어 좋습니다선생님강의의 1주차부터 본격적인 알고리즘 강의내용이 들어가는듯 한데 교안을 전부다 끝내고 수업을 듣는게 맞을까요? 아니면 같이병행하는게맞을까요?
-
해결됨Do it! 알고리즘 코딩테스트 with JAVA
소수구하기(백준1929) 오류
풀이에서 배열을 1부터 N까지 반복문을 돌며 현재 인덱스 값으로 초기화하는데1은 소수가 아니므로 2부터 N까지 반복문을 돌거나, 반복문이후에 A[1] = 0; 으로 초기화해야합니다.왜냐하면 문제의 입력 조건 범위가 1이상 1,000,000이하 이므로 M의 값이 1로 들어올 수 있기 때문입니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
조금 다른 로직으로 풀었는데 반례를 못찾겠습니다.
https://www.acmicpc.net/board/view/121782DFS 알고리즘을 사용했고, 높이 값들을 추출한 다음에 일일이 비교하면서 문제에서 주어진 조건대로 구현했습니다.높이에 따른 각 케이스마다 물에 잠기지 않은 영역의 수를 v_cnt 벡터에 저장하고 그 중 최댓값을 찾아서 출력하도록 했습니다.문제에서 주어진 예시대로 입력하면 잘 출력되는데 틀렸다고 뜹니다. 어디가 잘못된 걸까요?ㅠ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6-G 게임을 map으로 시도했습니다
안녕하세요 큰돌님.이분탐색 대신 map을 활용해서 풀어봤는데 반례를 찾을 수가 없네요 ㅠㅠㅠ 어떤 부분이 잘못된건가요?감사합니다.#include <bits/stdc++.h> using namespace std; int T; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> T; while(T--){ map<int, int> diary; int N, M, tmp; cin >> N; for(int i = 0 ; i < N ; i++){ cin >> tmp; diary[tmp]++;} cin >> M; for(int i = 0 ; i < M ; i++){ cin >> tmp; diary[tmp]++; if(diary[tmp]>=2){ cout << 1 << '\n'; diary[tmp]--; }else{ cout << 0 << '\n'; } } } return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
왜 틀렸는지 모르겠습니다.
http://boj.kr/13cd857dcaae4b858119dc6057a36655 DFS를 이용해서 풀었습니다. 전체적인 로직은 큰돌님이 보여주신 코드랑 다를 바 없는 것 같은데 cnt (큰돌님 코드에서는 ret) 값이 고정 1로 나옵니다.아무리 봐도 어디가 잘못된건지 모르겠습니다..
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-N 코드 질문있습니다
안녕하십니까 큰돌님강의 보기 전에 문제를 풀어봤는데 틀렸다고 나와서 질문드립니다. 최대 범위인 20억 * 20억일 때 long long 범위가 넘는데 pow 반환값을 long long 에 저장해서 틀린게 맞을까요 ?? 그리고 pow함수의 시간복잡도는 어떻게 되는지도 궁금합니다http://boj.kr/c90ff8da35d3490b859f8ee922c59bf9
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-M 반례를 잘 모르겠습니다
안녕하십니까 큰돌님좋은 로직이 아닌 것은 알지만 강의 듣기 전에 코드 작성했었는데 틀렸다고 해서 어떤 반례가 있는 것일까요 ?? http://boj.kr/d9d056ce29f948bca638664de0101191
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-I 개념 질문있습니다
안녕하십니까 큰돌님개념에서 Map은 map<string, int> mp; 이런 식으로 사용하는 것을 알겠는데 Arr 은 어떻게 String - int하는 건가요 ?? 예시 코드라도 보여주실 수 있을까요 ?? 말로 들었을 때 이해가 잘 안 가서 질문드렸습니다 ..!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
C++ 초기설정 에러 문의
큰돌님 안녕하세요!gcc 설치 후 vscode에 설정하는 중 일부 에러가 발생하여 질문 드립니다.현재 homebrew를 통해 gcc 설치 후 해당경로로 헤더파일을 만들어놓은 상태입니다.그 후, vscode a.cpp 파일의 터미널에 g++ -std=c++14 -Wall a.cpp -o test.out 를 입력하였을 때, 에러가 발생합니다.어떻게 수정해야할까요...
-
미해결코딩테스트 실전 모의고사(with C++) : 대기업 대비
BFS 참고하세요
#include <iostream> #include <vector> #include <queue> using namespace std; int n, m, k; int dx[4] = { 1, -1, 0, 0 }; int dy[4] = { 0, 0, 1, -1 }; int main() { cin >> n >> m >> k; vector<vector<int>> Map(n + 1, vector<int>(m + 1, 0)); vector<vector<bool>> visited(n + 1, vector<bool>(m + 1, false)); vector<pair<int, int>> flooded; for (int i = 0; i < k; i++) { int x, y; cin >> x >> y; Map[x][y] = 1; flooded.push_back({ x, y }); } int max_size = 0; for (auto& start : flooded) { if (visited[start.first][start.second]) continue; int size = 0; queue<pair<int, int>> Q; Q.push(start); visited[start.first][start.second] = true; while (!Q.empty()) { size++; int x = Q.front().first; int y = Q.front().second; Q.pop(); for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && Map[nx][ny] == 1 && !visited[nx][ny]) { Q.push({ nx, ny }); visited[nx][ny] = true; } } } max_size = max(max_size, size); } cout << max_size << endl; return 0; } DFS가 아닌 BFS 사용해도 문제는 풀립니다.공부중이라 어느게 더 효율적인지는 모르겠습니다만, 혹시 BFS로 접근하실 분들 참고하라고 올려봅니다~
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 교안 사용법
cpp에 대한 지식이 부족한데, 알고리즘 교안을 미리 한번 다 보고 나서 시작해야하는건가요??아니면 그냥 강의 쭉 따라 가면 되는걸까요강의 목차에는 Vector나 다른 기본 개념들에 대한 설명이 없는것 같아 문의 드립니다!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[1-H]시간 초과 관련해서 질문드립니다
http://boj.kr/ab659fec129e45c7b35407ed7e322f06 안녕하세요 선생님문제 제출 결과가 시간초과로 나왔는데 ,vector의 사용이 문제인지 이중 for문이 문제인지 아니면 다른 어떤 게 문제인지 궁금합니다 그리고 결과가 시간 초과라고 나왔을 경우 어떻게 대처하면 좋을까요? 예를 들어서 다른 자료형을 사용한다던지 아니면 로직을 바꾼다던지.. 제가 왕초보라 어떻게 대처해야 할지 모르겠습니다. ㅜㅜ 저는 위 코드를 다음과 같이 짰습니다.입력받은 온도 값을 벡터에 저장.총 n-k+1번 동안 반복해서 연속된 온도k개의 합을 구해 다른 벡터에 저장.가장 큰 값 출력. 항상 감사합니다!!
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
같은문자 제거하기
function solution(s){let answer="";for (const sElement of s) {if(answer.indexOf(sElement) === -1) answer += sElement}return answer;}console.log(solution("ksekkset")); 이렇게 짯는데 어떤가요? 피드백 부탁드립니다 ㅠ