묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
치즈 녹이는 로직을 벡터 없이 구현했는데 시간 초과가 발생합니다
평소에 문제 번호만 읽은 뒤 혼자 풀어보고 안풀리면 강의를 참고하면서 공부 중인데요,http://boj.kr/643383b66dea47fdac83a802a5ed1c3f해당 코드에서 치즈 녹이는 로직을0인 칸을 dfs로 돌면서 상하좌우에 1인 칸이 있으면 해당 칸을 2로 변경(0으로 바로 변경하면 다른 칸에서 마주칠때 문제가 생길 수 있으므로)dfs를 마친 뒤 recover함수에서 arr을 돌면서 2인 부분을 0으로 변경이런 방식으로 구현을 했는데 아무리 코드를 최적화 해봐도 계속 시간초과가 발생했습니다. 도저히 안돼서 큰돌님 강의를 보고 벡터에 좌표를 저장해 해결한 코드가 아래 링크입니다.http://boj.kr/f4f738238bdb453bbf9a967627ddb912강의를 참고해 문제를 해결하긴 했는데, 왜 첫 번째 방법이 더 느린지, 혹시 첫 번째 방법으로도 시간초과에 걸리지 않게 짤 수가 있을지 궁금해서 질문합니다!
-
미해결자바 코딩테스트 - it 대기업 유제
피부과 문제 질문입니다.
강의 해설 잘 보았습니다!저는 강사님 코드랑 다르게 풀어보았는데 이렇게 풀면 시간초과 문제가 있을까요??public class 피부과 { static int getTime(String time){ int H = Integer.parseInt(time.split(":")[0]) * 60; int M = Integer.parseInt(time.split(":")[1]); return H+M; } public static int solution(int[] laser, String[] enter){ int answer = 0; Queue<Integer> queue = new LinkedList<>(); ArrayList<Integer> info = new ArrayList<>(); for(String x : enter){ int t = getTime(x.split(" ")[0]); int n = Integer.parseInt(x.split(" ")[1]); info.add(laser[n]); queue.add(t); } int idx = 0; while(!queue.isEmpty()){ int temp = queue.poll() + info.get(idx); int res = 0; for(int x : queue){ if(temp > x){ res++; } else break; } answer = Math.max(answer,res); idx++; } return answer; } public static void main(String[] args){ System.out.println(solution(new int[]{30, 20, 25, 15}, new String[]{"10:23 0", "10:40 3", "10:42 2", "10:52 3", "11:10 2"})); System.out.println(solution(new int[]{30, 20, 25, 15}, new String[]{"10:23 0", "10:40 3", "10:42 2", "10:52 3", "15:10 0", "15:20 3", "15:22 1", "15:23 0", "15:25 0"})); System.out.println(solution(new int[]{30, 20, 25, 15}, new String[]{"10:20 1", "10:40 1", "11:00 1", "11:20 1", "11:40 1"})); } }
-
미해결코딩테스트 [ ALL IN ONE ]
시간복잡도 질문
안녕하세요. 좋은 강의 감사합니다.island 카운트 세는 문제에서 시간복잡도를 n^2으로 풀면 안된다고 하셨는데 풀이법에서는 이중포문으로 푸셨더라구요.이중포문은 시간복잡도를 n^2으로 알고 있는데 이렇게 푸신 이유가 있으신가요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
BFS 당근마킷 엔지니어 승원이 코드 질문있습니다
안녕하십니까 큰돌님강의 보기 전에 제가 먼저 코드 작성했었는데 디버깅으로 결과도 확인했을 때 잘 나오고 강사님 코드랑 유사한데 맞을까요 ??http://boj.kr/bb58425d5106413eae8e4b959504dbb6근데 백준 아무 문제에 제출했을 때 결과가 틀렸습니다 가 아닌 컴파일 에러 라고 뜨는데 로직이 잘못된 걸까요 ??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p.78 질문입니다.
자 그렇다면 first는 내림차순, second는 오름차순 정렬하고 싶다면 어떻게 해야할까요?바로 커스텀 비교함수 cmp를 만들어 매개변수로 넣으면 됩니다. (보통 cmp라는 함수명을 많이 씁니다.)pair의 first를 내림차순 하고 싶으면sort(v.begin(),v.end(),greater<pair<int,int>>());이렇게 해도 되지 않을까여?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
8-Z 질문입니다.
안녕하세요 큰돌님,for(int j = x1 + 1; j <= x2; j++){ cout << "j:" << j << " x2:" << x2 <<'\n'; _x[j]++; } 해당 코드에서 범위가 j <= x2 마지막 꼭지점이 포함되는 이유를 모르겠습니다. 아래 조건을 준수하려면 마지막 꼭지점은 제외해야 할 것 같은 생각이 들어서요. 단, 수평선 H는 다각형의 어떤 수평선분과도 겹처 놓여서는 안 되고, 유사하게 수직선 V는 다각형의 어떤 수직선분과도 겹쳐 놓여서는 안 된다.감사합니다! - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p.75 sort() 에 관한 질문입니다.
first는 정렬하고 싶은 배열의 첫번째 이터레이터, last는 정렬하고 싶은 배열의 마지막 이터레이터를 넣으면 됩니다. 또한 [first,last) 라는 범위를 갖습니다. 즉, first는 포함하고 last는 포함하지 않는다는 의미입니다. 그렇기 때문에 예를 들어 크기가 5인 a라는 배열 전체를 sort한다고 하면 sort(a[0],a[0] + 5)라고 해야 합니다. 즉, last에 배열의 마지막요소가 아닌 그 “다음”의 위치를 넣어주어야 합니다.굵게 표시친 부분에서 sort(a,a+5)가 아닐까요??
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
11. 문자열 압축 알고리즘 질문 있습니다.
인강에서 4분 20초 경에 IndexOutOfBoundsException이 발생하기 때문에 다음 코드의 solution 메소드에서 인자로 받는 s 뒤에 " "(공백문자)를 추가해주어야 한다고 말씀하셨는데,s = s + " ";" "(공백문자)를 추가하는 이유가 IndexOutOfBoundsException 발생이 아니라 마지막 문자 개수를 제대로 카운트하기 위함이 아닌지 질문드립니다. 아니면 IndexOutOfBoundsException가 발생할 수도 있나요? 그 이유는 무엇이고, 해당 테스트케이스는 어떤 것인가요? import java.io.*; import java.util.*; public class Main { public String solution(String s) { String answer = ""; s = s + " "; int count = 1; for (int i = 0; i < s.length() - 1; i++) { if (s.charAt(i) == s.charAt(i + 1)) { count++; } else { answer += s.charAt(i); if (count > 1) { answer += String.valueOf(count); } count = 1; } } return answer; } public static void main(String[] args) throws IOException { Main main = new Main(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(main.solution(str)); } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[ 6 - J ] 질문입니다
안녕하세요 선생님, 답지에서 이해가지 않는 부분이 있어 질문을 드립니다.https://www.acmicpc.net/source/share/c2fb354cd24049edb34fbd09a91a38d3check 함수 및 마지막에 직접 태우는 부분에서temp = 0으로 초기화해야 올바른 답이 나온다고 생각했는데 temp = m으로 초기화 해야 하는 이유를 확실히 모르겠습니다. 예제 2를 예시로 들어봤을 때 (학생 수 : 7, 놀이기구 수 : 2, 각각 운행시간 : 3 2)temp = 0으로 초기화하고 시작하면 6분이 되었을 때 놀이기구 1은 2명, 놀이기구 2는 3명을 막 완료한 상태이므로 남은 아이들은 2명, 2명을 각각 놀이기구 1, 2에 태워 운행이 끝날 때 까지 기다리면 + 3분으로 9분이 올바른 종료 시간 같은데 아닌 이유가 무엇인가요?
-
미해결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; }