묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
백준 1325 질문있습니다!
안녕하세요! 강의를 다 듣고, 블로그에 남겨주신 문제들을 풀어보고 있습니다.'백준 1325 효율적인 해킹 문제'인데, 시간 초과가 나는 기준을 이해하지 못해서 질문드립니다!import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.StringTokenizer; public class Main { private static int N, M; private static List<List<Integer>> graph; private static boolean[] visited; private static int dfs(int idx) { visited[idx] = true; int count = 1; for (int next : graph.get(idx)) { if (!visited[next]) { count += dfs(next); } } return count; } 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()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); graph = new ArrayList<>(N + 1); for (int i = 0; i <= N; i++) { graph.add(new ArrayList<>()); } for (int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); graph.get(b).add(a); } int max = -1; List<Integer> answer = new ArrayList<>(); for (int i = 1; i <= N; i++) { visited = new boolean[N + 1]; int count = dfs(i); if (max < count) { answer.clear(); answer.add(i); max = count; } else if (max == count) { answer.add(i); } } Collections.sort(answer); StringBuilder sb = new StringBuilder(); for (int n : answer) { sb.append(n); sb.append(" "); } bw.write(sb.toString()); br.close(); bw.close(); } } 이렇게 작성을 하니 자꾸 시간 초과가 나와서 chat gpt에 질문해보니 메모이제이션을 사용하면 해결할 수 있다는 답변이 나왔습니다. 이미 visited를 사용해 이미 방문한 노드를 다시 방문하지 않는데, 메모이제이션을 사용하는게 의미가 있을까 싶었지만 일단 코드를 변경해봤습니다.import java.io.*; import java.util.*; public class Main { private static int N, M; private static List<List<Integer>> graph; private static boolean[] visited; private static int[] memo; private static int dfs(int idx) { if (memo[idx] != -1) { return memo[idx]; } visited[idx] = true; int count = 1; for (int next : graph.get(idx)) { if (!visited[next]) { count += dfs(next); } } memo[idx] = count; return count; } 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()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); graph = new ArrayList<>(N + 1); for (int i = 0; i <= N; i++) { graph.add(new ArrayList<>()); } for (int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); graph.get(b).add(a); } int max = -1; List<Integer> answer = new ArrayList<>(); for (int i = 1; i <= N; i++) { visited = new boolean[N + 1]; memo = new int[N + 1]; Arrays.fill(memo, -1); int count = dfs(i); if (max < count) { answer.clear(); answer.add(i); max = count; } else if (max == count) { answer.add(i); } } Collections.sort(answer); StringBuilder sb = new StringBuilder(); for (int n : answer) { sb.append(n); sb.append(" "); } bw.write(sb.toString()); br.close(); bw.close(); } } 이렇게 작성하니까 시간 초과가 나지는 않는데, 어느 테스트 케이스에서 memo 배열에 저장된 값을 사용하는건지 알 수 있을까요?그리고 혹시 강사님은 이 문제를 이것과 다르게 푸셨을까요?? ++ 추가로 배열 대신 HashMap을 사용해도 시간 초과가 납니다... ㅠimport java.io.*; import java.util.*; public class Main { private static int N, M; private static List<List<Integer>> graph; private static boolean[] visited; private static Map<Integer, Integer> map; private static int dfs(int idx) { if (map.get(idx) != null) { return map.get(idx); } visited[idx] = true; int count = 1; for (int next : graph.get(idx)) { if (!visited[next]) { count += dfs(next); } } map.put(idx, count); return count; } 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()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); graph = new ArrayList<>(N + 1); for (int i = 0; i <= N; i++) { graph.add(new ArrayList<>()); } for (int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); graph.get(b).add(a); } int max = -1; List<Integer> answer = new ArrayList<>(); for (int i = 1; i <= N; i++) { visited = new boolean[N + 1]; map = new HashMap<>(); int count = dfs(i); if (max < count) { answer.clear(); answer.add(i); max = count; } else if (max == count) { answer.add(i); } } Collections.sort(answer); StringBuilder sb = new StringBuilder(); for (int n : answer) { sb.append(n); sb.append(" "); } bw.write(sb.toString()); br.close(); bw.close(); } }
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
섹션1 배열 강의 질문드립니다
배열은 참조에는 좋지만 삽입과 삭제는 비효율적이라고 하셨는데자바스크립트 배열은 처음에 크기를 지정하지도 않고, 메모리 할당도 불연속적으로 하니까 예외라는 건가요? 감사합니다.
-
해결됨코딩테스트 [ ALL IN ONE ]
시간복잡도 Big-O 표기법에 대해서
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요!질문이 2가지 있습니다.[기본]시간복잡도 Time Complexity 강의 @4:20부분에서 1/ "이처럼 입력값 n에 대한 실행시간 함수가 있다면, 최고차항의 계수만을 표기하여 Big-O(n)을 표기할 수 있다."이렇게 설명을 하셨는데, 제가 이해하기로는 계수는 숫자와 문자의 곱에서 '숫자'를 의미하는걸로 알고 있어서요!예를 들면, 3n이라고 한다면 숫자인 3이 계수라고 알고있습니다.그러면 Big-O표기법은 '최고차항의 계수만을 표기'하는게 아니라 '최고차항'을 표기하는걸까요? 2/ @4:27부분에O(n!) > O(2^n) > O(n^2)..이렇게 시간복잡도가 높은것부터 그래프로 보여주실때 '차수가 높은 순서는 다음과 같다'라고 말씀하셨는데제가 이해하기로는 '차수'는 문자가 곱해진 횟수, 즉 n^2면 2차, n^3이면 3차. 이런게 차수인걸로 알고있습니다.그렇다면 n!이 2^n보다 차수가 더 높고, 2^n이 n^2보다 차수가 더 높은걸로 이해하면 될까요? 감사합니다!
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
자바와 파이썬은 상속문법이 서로 원래 달라서 그런건가요?
자바를 배울때는 circle에 부모클래스의 함수인 .set_scale()을 써도 circle을 반환하지 부모객체는 반환을 안했는데.. 저건 파이썬만의 특징인가요?
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
python 3.11 실습 환경설정?
꼭 pyenv를 설치해야지만 실습이 가능한가요? 그러니까 replit이나 3.9나 3.10이 깔려있는 환경에서는 실습이 안되는거죠??pyenv가 앞서 전 강의시간에 나온 파이썬 가상환경 virtualenv와 같나요? 그러면 설정방식과 해제 방식도 같나요???
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
import sys로 실습하기
print(float(sys.version)<(3.9))print(sys.version_info<(3.9))안되는 이유가 뭘까요?? sys.version sys.version_info가 지저분하게 여러문자열이 뒤에 붙어서 변환이 안되는건가요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
저는 자바로 공부중인 학생인데요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.자바로 수업을 따라가기엔 힘든가요?아니면 충분한가요?
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
int(), float()에 대해서
head가 string이라 가정하면int(head)-> 변환된 int를 리턴float(head)->변환된 head를 리턴case로 비교시 기존 자료형과 변화된 자료형을 비교하여 원래 자료형이 int나 float가 아니면 false 인건가요?그리고 | 연산자가 있으니 if head원래 자료형 == head를 int로 바꾼 즉 int 자료형 | head 원래 자료형== head를 float으로 바꾼 즉 float 자료형 인건가요?
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
다른 재귀문제를 몇몇 개 풀어봤지만 하노이탑은 그냥 형태를 기억해서 푸네요..
하노이탑 문제가 어떻게 재귀의 기본문제일까요.. 다른 재귀문제 많이 풀어봤지만, 하노이탑은 정답 안 본 상태에서 며칠이고 고민해도 못풀었었고 지금도 사실 잘 모르겠네요.그냥 아래 항목들을 외워서 재귀 함수 호출하면 된다고 암기했습니다.n-1만큼 A에서 B로 옮기기가장 큰 원반 A에서 C로 옮기기나머지를 B에서 C로 옮기기 영상으로 보면 코드 한 줄 한 줄 실행되는 과정 보여주시면 "되니까 신기하네"라고 생각은 하지만, 1번 과정 중에 3번도 간헐적으로 일어나고, 3번하다가 1번도 계속 일어나면서 얼기설기 엉켜있어서 이해하기 힘드네요. 다들 대략적인 형태를 기억해서 푸는것일뿐 정확히 탑이 이동하는 절차 순서에 대해서 파악하고 쓰는건 아니겠죠?!
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
강의 내용에 있는걸 주석풀고 print 해보았더니..
datetime.datetime()을 해서 print했더니 왜 작동이 안될까요?
-
해결됨자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
iterator 관련 질문입니다.
안녕하세요.iterator관련 해서 간단하게 질문 드립니다.hasNext() 와 next() 함수 모두 다음에 있는 요소에 관한 함수지 않습니까?코드를 작성하다가 문득 든 생각인데 이터레이터가 위치한 인덱스의 다음 인덱스를 뜻한다면 첫번째 원소는 어떻게 다룰 수 있는걸까?라는 의문이 들어서 질문글을 작성하게 되었습니다.1)여기서 다음의 뜻이 이터레이터가 위치한 인덱스를 말하는것인가요?아니면 이터레이터가 위치한 인덱스의 다음 인덱스를 말하는것인가요? 물론 전자여야 모든 뜻이 말이 되고 이해가 가기 때문에 전자겠지만자바 사이트에서 함수 정의를 보면 next라고 적혀 있어서 혹시나 해서 질문드립니다.전자가 맞다면 왜 하필 햇갈리게 next라고 했을까요? 2)그리고 hasNext가 이후에 요소가 있는지를 체크하는 함수라면 이터레이터가 arrayList의 마지막 인덱스에 위치할땐 false값을 리턴해서 마지막번째 원소를 다룰 수 없게 되지 않나요?혹시 arrayList도 마지막 원소에 c의 문자열 처럼 마지막에 null값이 항상 있기 때문에 마지막 원소까지 hasNext함수가 다룰 수 있는건지 궁금합니다. 다음이라는 단어 때문에 간단하던것들이 갑자기 모두 햇갈리네요.
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
[그리디 실전 문제] 최솟값을 만드는 괄호 배치 찾기 (백준 1541) - 반례를 못찾겠습니다 ㅠㅠ
안녕하세요!항상 좋은 강의 감사드립니다!덕분에 하루 하루 실력이 느는것이 느껴질 정도로 도움이 많이 되고있습니다! ㅎㅎ다름아니라 문제 36번 에서 같은 원리로 해결한 코드인데 백준에 재출했을 때 2% 에서 오답처리가 되었고,아무리 찾아봐도 잘못된 부분과 반례를 찾을 수 없어서 질문 남기게 되었습니다 ㅠㅠ아래는 제가 만든 코드입니다.항상 감사드립니다 :)import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String N = sc.next(); String[] split = N.split("-"); int result = 0; for (int i = 0; i < split.length; i++) { String[] A = split[i].split("\\+"); int sum = 0; for (int j = 0; j < A.length; j++) { sum += Integer.parseInt(A[j]); } result -= result == 0 ? sum * -1 : sum; } System.out.println(result); } }
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
asyncio와 await 키워
그림에서는 task가 2개 동시에 실행되는걸로 보이는데 왜 피피티에서는 single thread single process라고 하나요?2. await을 만나면 하던 태스크를 잠시멈춘다고했는데, await 뒤에 코드 ~sleep(1)까지 다 읽고 실행한 상태에서 멈추는건가요?태스크와 스레드 차이점이 뭔가요? 똑같은 개념아닌가요?
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
poetry pypi 실습
이 내용들은 vscode shell에 입력해서 실행하는건가요? [tool.poetry.dependencies] pendulum="^2.1" 이 부분은 .toml파일에 넣는건가요?
-
미해결실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
venv 따라하기
인터프리터 설정했는데 안되는 이유가 무엇일까요...?
-
미해결코딩테스트 [ ALL IN ONE ]
안녕하세요 강사님!
강사님 수업 강의 모두 결제해서 틈틈히 잘보고있는 개발자입니다 :)코테 강의 시청하다가혹시 cs강의 노션에 pdf파일 만들어주신거처럼개발자취업비밀노트코딩테스트이렇게 2개의 노션으로 공유해준 사이트에도 각각 pdf파일로 올려주실생각은 없으실까요ㅠ?ipad에 넣어서 밑줄치면서 공부하기가 편했던 기억이 있어서 궁금합니다! 만약 있으시면 일정도 알 수 있을까요!! :)
-
해결됨2주만에 통과하는 알고리즘 코딩테스트 (2024년)
완전탐색(For 반복문) 14분
for x in range(-10000, 10001): for y in range(-10000, 10001): if A * x + B * y == C: if D * x + E * y == F: print(x, y) break range가 빠진거죠?
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
정규표현식에서 . 과 ^ 에 대하여
r = re.findall(r'.at', 'The person wearing the hat sat in the shade')에서 . 이 하는 역할이 뭔가요?r = re.findall(r'[^!.?]+', "Jesus! Hello World. Typical?")여기서는 . 이 글자자체로 . 이지만 위에서는 .이 패턴을 나타내는건가요? r = re.findall(r'^\d', '1 person wearing the hat sat in the shade2')그리고 ^ 이 처음을 나타낸다고 하셨는데 그러면 무조건 문장 처음에 있는 숫자만 찾는건가요 아니면 person wearing 1 ~ 이런식으로 있을때 문장 맨처음부터 찾는데 처음 찾은 숫자가 1이네 이런식으로 찾는건가요?
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
촌수계산질문
안녕하세요! 선생님이 알리켜주신대로 한번 다시 하다가 저는 bfs 메소드에서 ++count로 했는데 count+1과 무슨 차이가 있을까요?? 백준에서 돌려봤더니 틀렸다고 떠요! private static void dfs(int start, int count) { visited[start]=true; if(start==end){ answer=count; return; } for(int i=1;i<=N;i++){ if(visited[i]==false&&graph[start][i]){ dfs(i,++count); } } }
-
해결됨실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지
return list(map(str, range(num)))
return list(map(str, range(num)))여기에서 range() 함수 자체가 iterator를 반환하나요?그럼 예전 강의에서 list자료형을 넣었을때도 iterator를 반환했던걸까요...?그리고 람다형식으로 lamda i:str(i) 가 아니라 str만 써도 되나요....??그리고t = timstmt = """gen_num1(1000)"""eit.timeit(stmt=stmt, setup=setup, number=10000)stmt자체에 숫자몇번을 돌리라는 뜻이 이미 있는데 number=10000는 왜 또 쓰는건가요?