// 1. dfs 실행 int answer = 0; for(int i = 1; i <= N; i++) { for(int j = 1; j <= M; j++) { if(visited[i][j] == false) dfs(i, j); answer++; } } 안녕하세요. dfs문을 호출한 이후에 answer++;를 했을 때는, 주어진 값과 다르게 나오는데, 어떤 부분에서 차이가 있는지 궁금합니다.. 감사합니다!
안녕하세요. 해당 문제의 코드를 다음과 같이 짰는데, 출력하면 항상 0이 출력됩니다. 강의에 나온 부분과 거의 동일한데, 어느 부분에서 오류가 발생하는지 잘 모르겠습니다. 감사합니다. import java.util.*; import java.io.*; class Main { final static int MAX = 50 + 10; static boolean[][] map; static boolean[][] visited; static int W, H; static int[] DirY = {-1, -1, -1, 0, 0, 1, 1, 1}; static int[] DirX = {-1, 0, 1, -1, 1, -1, 0, 1}; public static void dfs(int y, int x) { visited[y][x] = true; for(int i = 0; i < 8; i++) { int newY = y + DirY[i]; int newX = x + DirX[i]; if(map[newY][newX] && visited[newY][newX] == false) { dfs(newY, newX); } } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 0. 입출력 while(true) { StringTokenizer st; st = new StringTokenizer(br.readLine()); W = Integer.parseInt(st.nextToken()); H = Integer.parseInt(st.nextToken()); // 마지막 입력 값이 0이면 while 문 빠져나오기 if(W == 0 && H == 0) break; map = new boolean[MAX][MAX]; visited = new boolean[MAX][MAX]; for(int i = 1; i <= H; i++) { st = new StringTokenizer(br.readLine()); for(int j = 1; j <= W; j++) { map[i][j] = (Integer.parseInt(st.nextToken()) == '1') ? true : false; } } int answer = 0; for(int i = 1; i <=H; i++) { for(int j = 1; j <=W; j++) { if(map[i][j] && visited[i][j] == false) { dfs(i, j); answer++; } } } bw.write(String.valueOf(answer)); bw.newLine(); } bw.close(); br.close(); } }
안녕하세요! 항상 수업 듣고 예제를 풀이하는 방식으로 공부하고 있습니다. 이번에도 그렇게 풀려고 천천히 문제를 읽었더니 조금 다른 문제인 것 같아서.. 수정 요청 드립니다. 3강의 문제 1번 백준 유사 예제는 2259가 아니라 2559인 것 같습니다. 수정 부탁드립니다!
import java.io.*; import java.util.*; public class Main { static final int MAX = 100000 + 10; static ArrayList<Integer>[] graph; static boolean[] visited; static int[] answer; static int N, M, R; static int order; public static void dfs(int idx) { visited[idx] = true; answer[idx] = order; order++; for (int i = 0; i < graph[idx].size(); i++) { int next = graph[idx].get(i); if (!visited[next]) { dfs(next); } } } public static void main(String[] args) throws IOException { // 0. 입력 및 초기화 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); R = Integer.parseInt(st.nextToken()); graph = new ArrayList[MAX]; for (int i = 1; i <= N; i++) { graph[i] = new ArrayList<>(); } visited = new boolean[MAX]; answer = new int[MAX]; order = 1; for (int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); graph[x].add(y); graph[y].add(x); } // 2. 내림차순 정렬 for (int j = 0; j < N; j++) { Collections.sort(graph[j], Collections.reverseOrder()); } // 3. 재귀함수 출력 dfs(R); for (int k = 1; k <= N; k++) { bw.write(String.valueOf(answer[k])); bw.newLine(); } br.close(); bw.close(); } } 해당 코드를 구현했는데, 널 포인터 에러가 뜹니다..! 어떤 부분에서 잘못됐는지 피드백 받고자 질문드립니다! 감사합니다
안녕하세요! 강의를 듣다보니 궁금한게 생겨서 문의남깁니다! 9:46분에서 A,B,C가 현재 (0,candy +1)로 반복문을 돌고있는데요! 문제 조건에서는 셋중 사탕을 하나도 못받는 친구는 없어야합니다" 라는 조건을 만족시키기 위해 (0,candy +1) -> (1,candy +1) 로 변경해서 한다면 완전탐색적방법으로 생각하는게 위배되는걸까요! 모든 경우의수를 확인을 해야 하니깐 0도 포함을 해서 문제를 풀어나가는게 맞는건지! 궁금했습니다! 강사님 말씀대로 완전탐색적인 방법이 저랑 뭔가 잘맞는거같아서 익숙해지려고 하고있습니다:) 감사합니다!
강의를 본 후에 아래와 같이 코드를 작성한 후 백준에 제출했는데 왜 틀렸는지 이유를 모르겠습니다 N= int(input()) hint = [list(map(int,input().split())) for _ in range(N)] answer =0 for a in range(1,10): for b in range(10): for c in range(10): if(a==b or b==c or a==c): continue cnt =0 for arr in hint: number = list(str(arr[0])) ball = arr[1] strike = arr[2] ball_count = 0 strike_count =0 if(a== int(number[0])): strike_count+=1 if(b== int(number[1])): strike_count+=1 if(c== int(number[2])): strike_count+=1 if(a== int(number[1]) or a == int(number[2])): ball_count+=1 if(b== int(number[0]) or b == int(number[2])): ball_count+=1 if(c== int(number[1]) or c == int(number[0])): ball_count+=1 if ball_count == ball and strike_count == strike: cnt += 1 if cnt == N: answer=+1 print(answer)
선생님 안녕하세요 일단 너무 만족스러운 강의 준비해주셔서 감사하고 정말 돈이 하나도 아깝지 않은 강의입니다. DFS 강의 말고도 다른 알고리즘 강의도 준비해주시면 너무 좋을것 같아요 ㅠㅠ 아무튼 질문은요, 선생님 강의를 듣고 아래처럼 제가 코드를 짰는데 선생님 코드랑 몇번을 비교해도 다른 점이 보이질 않는데 백준에서 제출했을 때 계속 메모리 초과라고 나옵니다. 혹시나 제가 바보같은 실수를 했을 수 있으니 미리 사과드립니다 ㅠㅠ!! 감사합니다 import sys sys.setrecursionlimit(10**6) N, M = map(int, sys.stdin.readline().split()) MAX = 1000 + 10 graph = [[False] * MAX for _ in range(MAX)] visited = [False] * MAX answer = 0 for _ in range(M): u, v = map(int, sys.stdin.readline().split()) graph[u][v] = True graph[v][u] = True def dfs(idx): visited[idx] = True for i in range(1, N + 1): if not visited[i] and graph[idx][i]: dfs(i) for i in range(1, N + 1): if not visited[i]: dfs(i) answer += 1 print(answer)
안녕하세요. 강사님! 완전탐색적방법으로 접근하는 방법을 익히고싶은데 이해하고 있는게 맞는지 궁금해서 질문남겼습니다! 24:10분쪽 내용을 보면서 궁금한 내용이 있습니다! 만약에 x축[] 짱구:5, 철수:7 , 맹구:9 일때 문제 조건에 제시된 1 - 1_000_000까지 전체 순회를 하면서 1번 위치일때 짱구: 1 - 5, 철수 : 1 - 7, 맹구: 1 -9 2번 위치일떄 짱구: 2 - 5, 철수 : 2 - 7, 맹구: 2 -9 x[] 원소를 기준으로 쭉 1_000_000까지 모든경우의수를 다구하는게 맞는지 궁금합니다. 최적화 아이디어를 하기전 완전탐색적인 방법을 제대로 이해하고있는지 체크하기 위함입니다! 감사합니다!
안녕하세요. 선생님~ [AVL트리 - 개념] 강의 - 회전 관련 질문있습니다. 7:00 즈음 LL회전, RR회전 펼져있는 노드 이미지가 반대로 된것 아닌지? 궁금합니다. 헷갈려서 검색해보니 LL이라는 용어가 회전할 기준이 되는 노드의 왼쪽 노드, 그 다음 왼쪽 노드 형태에서 오른쪽으로 회전해서 균형을 맞추자!로 대체적으로 설명이 되어있는것같습니다. (이미지로는 왼쪽으로 쭉 내려가는 이미지) 위키백과에는 따로 LL,RR이라는 용어설명이 없어서, 블로그 글들 참조하였습니다. 뭔가 관점 차이인 부분일까요?
def dfs(idx): global visited, graph, answer visited[idx] = True answer += 1 for i in range(1,N+1): if not visited[i] and graph[idx][i]: dfs(i) 이와 같은 dfs 재귀함수에서 dfs(1)이 맨 처음에 실행되고 조건에 따라 계속 재귀되는데 마지막 dfs(7)까지 간다고 했을 때 range(1,N+1)에 범위는 넘지만 dfs(8), dfs(9), ... 이런식으로 계속 코드가 돌아버릴 수도 있는 것이 아닌가요?? DFS와 재귀함수가 처음이여서 질문을 명확하게 못 작성한 것 같네요. return이라는게 필요한 것이 아닌지, 재귀함수에 종료조건 이 어떻게 되는 것인지 궁금해서 여쭤봅니다. 답변 기다리겠습니다. 감사합니다
안녕하세요 ! 강의를 잘 보고있습니다 :) 1520 문제를 처음 접하였을때, dp를 사용하지 않았었는데요 강의를 보니 강사님께서도 처음에는 dp테이블을 사용하지 않고 푸시다가, 나중에 dp를 추가해주시더라구요 .. ! 이, 이유가 백준에서 시간제한이 걸리기 때문에, 이미 방문한곳은 다시 방문하지 않기위해 그러는 것 인가요 .. ? 아직 들어야할 강의가 많아서, 문제가 이렇다 저렇다 말 할 수 없겠지만 만약, 코테에서 위와같이 문제가 나오면, 시간제한이 걸리는지 아닌지를 확인할 방법이 없는데 항상 dp테이블을 생각하는것이 좋은 방법일지 궁금합니다 .. !
안녕하세요! 제 6강을 수강하고 탑다운 DP 문제 중 냅색문제를 백준에서 풀었을 때 계속 런타임에러가 나네요 ㅠ 혹시 이유를 알 수 있을까요 ? 제가 작성한 코드는 다음과 같습니다. #물건의 수 n와 배낭의 무게 k n,k = map(int,input().split()) #순서대로 배낭의 무게 w와 가치 v item = [list(map(int,input().split())) for _ in range(n)] dp = [[-1 for _ in range(10*6)] for _ in range(n)] #모든 경우의 수 생각하기 def bag(idx , weight ) : if weight > k : return -999 if idx == n : return 0 if dp[idx][weight] != -1 : return dp[idx][weight] #물건을 넣은 경우와 넣지 않은 경우를 비교해준다 dp[idx][weight] = max( bag(idx+1 , weight + item[idx][0]) + item[idx][1] , bag(idx+1 , weight)) return dp[idx][weight] ans = bag(0,0) ans
def recur(idx, weight): if weight > K : return -99999 if idx == N : return 0 if dp[idx][weight] != -1: return dp[idx][weight] dp[idx][weight] = max(recur(idx + 1, weight + items[idx][0]) + items[idx][1], recur(idx + 1, weight)) return dp[idx][weight] N,K = map(int,input().split()) items = [list(map(int,input().split())) for _ in range(N)] #무게를 고려해서 가치를 담는 dp테이블, 무게는 얼마든지 커질 수 있으므로 10만, 그리고 물건개수만큼 N 작성 dp = [[-1 for _ in range(100_001)] for _ in range(N)] print(recur(0,0)) recur(0,0) 재귀함수를 불렀는데 dp 테이블의 최대값이 찍히는게 잘 이해되지 않습니당...! 당연히 dp테이블에서 max값을 찾아 출력해야 하는 줄 알았는데, 코드를 보니 그냥 print(recur(0,0))을 하네욥..!
def recur(idx,money): global answer if idx == n: answer = max(answer, money) return if idx > n: return # idx 해당날에 상담 ㄱㄱ recur(idx + arr[idx][0], money + arr[idx][1]) # pass 하는날 recur(idx + 1, money) n = int(input()) arr = [[] for _ in range(n+1)] for i in range(n): t,p = map(int,input().split()) arr[i+1] = [t,p] answer = -999999 recur(1,0) print(answer) 위는 제 코드입니다. 이 코드를 백준에 제출하면 오답이 나옵니다. 테스트 케이스의 경우에는 맞았는데. 근데 위 코드에서 if에 해당하는 부분을 아래와 같이 고치면 정답이 나오더라고요. if idx == n+1: answer = max(answer, money) return if idx > n+1: return 제가 아직 재귀에 대한 완벽한 이해가 없고, 어떤 식으로 재귀함수가 동작하는 지는 정확히 몰라서 구글링을 통해 재귀 함수는 스택방식으로 작용한다라는 내용도 공부해보고 왜 n+1은 통과고 n은 실패인지 암만 생각해봐도 모르겠네요,, 도와주십시오!!