import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class FindCow { static int personPos; static int cowPos; static int[] idx = {5, 1, -1}; public static int solution(int n) { boolean[] visit = new boolean[10_001]; Queue<Integer> queue = new LinkedList<>(); visit[n] = true; queue.offer(n); int level = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { Integer curPos = queue.poll(); for (int k = 0; k < 3; k++) { int nextPos = curPos + idx[k]; if (nextPos == cowPos) { return level + 1; } if (nextPos < 10_001 && nextPos > 0 && !visit[nextPos]) { queue.offer(nextPos); visit[nextPos] = false; } } } level++; } return 1; } public static void main(String[] args) { Scanner in = new Scanner(System.in); personPos = in.nextInt(); cowPos = in.nextInt(); System.out.println(solution(personPos)); } } 안녕하세요! 좋은 강의 항상 감사드립니다. 강의 중, 송아지 찾기(BFS)에서 시간 초과가 떠서 확인해 보니, 강의에서 올려주신 코드와 딱히 다른 부분이 없어 보이는데 시간초과가 납니다. 왜 그럴까요?
선생님 안녕하세요! 최소값 확인 오름차순 모두 처리 했다고 생각하는데 1%에서 '틀렸습니다'로 나옵니다 ㅎㅎ... 예제랑 제가 생각한 반례를 몇 가지 넣어보았으나 잘 통과하는 것으로 보입니다. 어떤 문제가 있을까요? 코드 링크 첨부드립니다. (변수명 너무 대충써서 죄송합니다..) https://www.acmicpc.net/source/74000922 항상 감사합니다.
안녕하세요, 추가강의를 듣다가 2가지 질문사항이 생겨 다시 글을 쓰게 되었습니다.^^ 위 문제를 설명해주실 때, 처음에 recur으로 접근하신 후 dp로 바꿔서 설명을 해주셨는데요, 15:45 부분에서 설명해주신 내용 중 return으로 인해 계산이 끝나지 않고 이웃 칸으로 이동해서 계속해서 계산을 이어가도록 하는 부분이 return 0 을 return dp[y][x] 로 바꾸는 부분에 해당하는 것인지 질문드립니다. 또한, 마지막에 답을 출력할 때, print(max(map(max,dp))+1 왜 +1을 해주는지 궁금합니다. [정답 코드] 오늘도 감사합니다~
ret과 재귀로 호출하는 부분 최소 값으로 셋팅하는 결과를 실시간으로 보고 싶습니다. ret = min(ret, tsp(i, visited | (1 << i)) + dist[here][i]); 이 부분 나눌 수 있을까요? int temp = tsp(i,visited | (1<<i)) + dist[here][i]); if(ret > temp) ret = temp; 이런식으로 나누고 싶은데 어떻게 건드려야될지 모르겠습니다..
강의를 들어보다가 백준 - 16964번 DFS 스페셜 저지 문제를 풀어 보았는데 여러개의 답이 나올 수 있는 경우를 특정하기가 어려줘 질문 남겨봅니다!.. graph에서 순차적으로 나오는 경우는 답을 구할 수 있는데 그래프에서 랜덤한 방향으로 진행될 시 어떻게 해야되는지 궁금합니다!.. 제가 짜본 기본 코드입니다..ㅜㅜ 도움 부탁드립니다! import sys sys.setrecursionlimit(10**6) input = sys.stdin.readline # 함수 def dfs(idx): global visited, answer, graph, order visited[idx] = True answer[idx] = order order += 1 for i in graph[idx]: if not visited[i]: dfs(i) # 0. 입력 조건 N = int(input()) visited = [False] * (N+1) answer = [0] * (N+1) order = 1 graph = [[] for _ in range(N+1)] # 1. 그래프 받아오기 for _ in range(N-1): x, y = map(int, input().split()) graph[x].append(y) graph[y].append(x) # 2. dfs 수행 dfs(1) # 3. 출력하기 given = list(map(int, input().split())) # answer.sort() answer = answer[1:] if given == answer: print(1) else: print(0)
안녕하세요, 강의 잘 듣고 있습니다. 문제를 읽고, 스스로 짜보고 있습니다. 그런데 비트마스킹 부분에서 제가 생각한 것처럼 동작하지 않아 무슨 부분이 문제인지 궁금합니다. 아무리 print를 찍어서 찾아보려고 해도 찾지 못해 질문드립니다. 문제 부분 // DFS 함수 (18, 19번째 줄) if(a[y][x] & (1 << i)) continue; _ret += dfs(ny, nx); http://boj.kr/b423ee8869844758a31b0c3c5d67fd49
import java.util.Scanner; public class 문자찾기 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String text = sc.next(); String ch = sc.next(); int cnt = 0; for(char rs : text.toCharArray()) { if(ch.toUpperCase().equals(String.valueOf(rs).toUpperCase())) { cnt++; } } System.out.println(cnt); sc.close(); } } 문자찾기 위 코드로 강의 전 스스로 푼건데 불필요한 소스부분이 있는지 평가 요청드립니다.
안녕하세요 큰돌님 😀 교안 p176에 1 0진법을 2진법으로 바꾸는 코드에서 #include <bits/stdc++.h> using namespace std; vector<int> v; int main() { int n = 100; int b = 2; while (n > 1) { v.push_back(n % b); n /= b; } if (n == 1) v.push_back(1); // 마지막 몫이 1일 때 reverse(v.begin(), v.end()); for (int a : v) { if (a >= 10) // 이 조건은 16진법 변환을 위해 필요함. { cout << char(a + 55); // char(a + 55)에서 a가 10이면 char(65)가 되서 'A'가 된다. } // 16진법은 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}로 표현하는 방법 else { cout << a; } } return 0; } while문에서 조건을 n > 1 로 하신 이유가 궁금합니다! while (n > 1) { v.push_back(n % b); n /= b; } if (n == 1) v.push_back(1); // 마지막 몫이 1일 때 이 부분을 while (n >= 1) { v.push_back(n % b); n /= b; } 이렇게 바꾸면 문제가 생길까요?? 제가 n에 여러 값을 넣어봤을 땐 문제가 없었는데 반례가 있다면 알려주시면 감사하겠습니다!
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <queue> #include <string> #include <math.h> #include <cstring> #include <stack> using namespace std; int arr[3] = {}; int dmg[6][3] = { {1,3,9},{1,9,3},{9,1,3}, {9,3,1},{3,1,9},{3,9,1} }; int visited[64][64][64] = {}; struct A { int a; int b; int c; }; queue<A> mq; void BFS() { while (!mq.empty()) { int x = mq.front().a; int y = mq.front().b; int z = mq.front().c; mq.pop(); if (visited[0][0][0]) { break; } for (int i = 0; i < 6; i++) { int nx = x - dmg[i][0]; if (nx < 0) { nx = 0; } int ny = y - dmg[i][1]; if (ny < 0) { ny = 0; } int nz = z - dmg[i][2]; if (nz < 0) { nz = 0; } if (visited[nx][ny][nz] != true) { mq.push({ nx,ny,nz }); visited[nx][ny][nz] = visited[x][y][z] + 1; } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N; cin >> N; for (int i = 0; i < N; i++) { cin >> arr[i]; } mq.push({ arr[0],arr[1],arr[2] }); visited[arr[0]][arr[1]][arr[2]] = 1; BFS(); cout << visited[0][0][0]-1; } 메모리 초과가 나는데 아무리 봐도 어디가 나는지 모르겠습니다ㅜㅜ..
http://boj.kr/8e44c6b66d4644008651ce44ab448ea8 res.push_back(k); for (int i = prev[k]; i != n; i = prev[i]) { res.push_back(i); } 이 부분으로 인해서 메모리초과가 발생하는 거 같은데 왜 발생하는지 이유를 잘 모르겠습니다.
안녕하세요,이 문제에서 prefix 를 만드실 때 처음부터 5*5 리스트를 만드셨는데 이 아이디어는 어떻게 떠올리신 건지 궁금합니다. 저 방식이 누적합 문제를 풀 때 일반적으로 사용되는 방식인가요?저같은 경우에는 4*4형식으로 만들어서 코드를 작성하였는데 이렇게 하니 답은 맞는데 시간 초과가 뜨네용 n, m = map(int, input().split()) box2 = [] for _ in range(n): box2.append(list(map(int, input().split()))) for i in range(n): for j in range(n): if i - 1 >= 0: box2[i][j] += box2[i - 1][j] if j - 1 >= 0: box2[i][j] += box2[i][j - 1] if i - 1 >= 0 and j - 1 >= 0: box2[i][j] -= box2[i - 1][j - 1] # 쿼리 처리 for _ in range(m): x1, y1, x2, y2 = map(int, input().split()) answer = box2[x2 - 1][y2 - 1] if x1 - 2 >= 0: answer -= box2[x1 - 2][y2 - 1] if y1 - 2 >= 0: answer -= box2[x2 - 1][y1 - 2] if x1 - 2 >= 0 and y1 - 2 >= 0: answer += box2[x1 - 2][y1 - 2] print(answer)
투포인터를 하기 위해서 정렬을 사용하셨는데, 문제를 읽어보면 '... a1, a2, ..., an으로 이루어진 수열이 있다. ... 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는' 이라는 문구가 있어서, 정렬을 하게 되는 순간 기존의 index 순서가 바뀌기 때문에 함부로 정렬을 하면 안되는 문제 아닌가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요!어제 점심때쯤 결제했는데 아직 노션 공유가 안되었습니다ㅠㅠ 빨리 부탁드립니다!!