two_sum 문제에서 input으로 주어지는 nums에는 중복 원소가 없다고 가정하나요? 문제에 '같은 원소를 두 번 사용할 수 없습니다.'라는 조건이 있는데, 예를 들어, nums = [4,1,9,7,8,2], target=14인 경우에는 False를 출력해야 하는 반면, nums = [4,1,9,7,7,2], target=14인 경우에는 True를 출력해야 하니까 원소 중복 가능 여부를 여쭤보게 되었습니다!
class Solution(object): def lowestCommonAncestor(self, root, p, q): if root is None: # check whether Node is empty return if root is p or root is q: return root # root 노드가 p 또는 q가 아니면 순회하도록 재귀함수 호출 l = self.lowestCommonAncestor(root.left, p, q) # code 1 r = self.lowestCommonAncestor(root.right, p, q) # code 2 # p와 q 조건 검사를 마친 후(모든 노드를 순회하는 것은 아님) if l and r: return root elif l: return l else: return r 먼저 LCA함수를 호출하면 root가 가리키는 노드가 있는지 체크한 다음에 계속해서 p 또는 q 노드가 맞는지 확인을 합니다. 만약 p 또는 q 노드가 아니면 재귀함수를 호출해서 자식 노드로 더 깊이 순회하도록 만듭니다. 역시 자식 노드들도 p 또는 q 노드가 맞는지 검사한 후 맞으면 l 또는 r에 그 노드를 저장합니다. 여기서 궁금한 점은, 자기 자신이 공통 조상이 될 때인데요. 이렇게 되면 더 깊이까지 탐색하지 않아도 elif l: return l 에 의해서 왼쪽만 탐색했으니까 시간복잡도가 O(logN)인가요? 아니면 다른 케이스들도 고려해서 최악의 경우 모든 노드를 탐색해야되니까 O(N)이 되는건가요?
안녕하세요, 강의을 따라 코딩을 해보던 중 임시배열 tempArr을 작성하다가 tempArrIndex = leftIndex 에서 leftIndex 대신 0을 넣었는데 그러면 코딩 실행이 정상적으로 되지 않아서 (강의 13:38 부분) 무엇이 잘못됐는지 궁금해 질문 드립니다. 감사합니다 :)
자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
ArrayList<String> a = new ArrayList<>(); a.add("1"); a.add("2"); a.add("3"); int[] arr = {1, 2, 3}; arr[0] = 4; // 가능 a.get(0) = "one"; // 불가능 위와 같이 배열도 ArrayList 객체도 모두 Reference type입니다. 배열에 대한 인덱스 접근은 r-value, l-value로 모두 기능할 수 있는데 ArrayList에 대한 get()은 r-value(값으로만 사용)로써만 기능하고 있습니다. get()의 반환형이 E로 제네릭(객체)인데 read only로 취급되는건가요...? get()으로 해당 위치를 참조하는게 아닌건가요? 해당 메모리가 아닌 메모리의 값을 꺼내오는건가요? HashMap<String, String> h1 = new HashMap<>(); h1.put("1", "one"); h1.get("1") = "하나"; // 불가능 다른 컬렉션 프레임워크지만 동일한 문제입니다. put(key, value)를 사용해 값을 저장하고 get(key)를 사용해 value를 가져올 때 get()으로 값을 바꿀 수는 없는 건가요? HashMap<String, ArrayList<String>> hashMap = new HashMap<>(); hashMap.get(date).add(Obj); // 가능 이 경우에는 get()으로 참조한 메모리에 대해 다시 참조하여 메서드 사용이 가능했습니다. 이러한 동작이 get()으로 값을 반환하는 것이 아니라 객체 메모리에 접근한다고 생각했습니다. 위에 질문과 함께 조금 더 직관적인 질문 드립니다. public static void main(String[] args) { // Calendar calendar = new Calendar(); // calendar.run(); HashMap<String, String> h = new HashMap<>(); h.put("1", "before"); System.out.println(h.get("1").equals("1")); // 참조하여 메서드 동작 확인 h.get("1") = "after"; // 불가능 => 왜 안되는지? String str = "before"; System.out.println(str.equals("before")); // 참조하여 메서드 동작 확인 System.out.println(str); str = "after"; // 변경 가능 => 왜 되는지? System.out.println(str); } 위 코드에서 각각 get()과 참조 변수 자체로 접근하였습니다. get()으로는 메서드까지는 접근이 가능하나 값 변경이 안되었고 참조변수는 메서드 접근은 물론 값 변경(엄밀히 말하면 참조 변경)까지 되었습니다. 이유가 궁금합니다. 감사합니다.
선생님 안녕하세요 유튜브에서 보고 오늘 처음 수강했는데 너무 귀에 잘 들어와서 재미있어요 bfs 강의도 올려주세용! 다름이 아니고 바이러스 코드 중 이해가 안 되는 부분이 있어 질문 남깁니다! 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) 바이러스 코드에서 idx가 3이 되고 answer가 3이 되는 부분 까지는 이해를 했는데 idx가 3일 때 for문을 돌면 2는 이미 방문했기 때문에 if문은 7까지 true가 되지 못하고 종료되는 것 아닌가요? 다시 idx=2로 돌아가서 5를 방문하게 되고 1에서 6을 방문하게 되는 부분은 코드 어느 부분에서 이루어지는 건지 잘 모르겠어요ㅜㅜ
자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
public synchronized String lendBook() throws InterruptedException{ while (bookList.size() == 0) { wait(); } String book = bookList.remove(0); System.out.println(Thread.currentThread() + " 학생이 책을 빌렸습니다."); return book; } 위 코드의 경우 synchronized method 로 처리하였습니다. 이 경우 shared resource(예제의 경우 this 객체)에 접근하는 3개의 thread에 대해서도 하나의 쓰레드가 차지한 경우 lock을 걸고 사용이 끝나면 다음 쓰레드가 사용하는 과정을 거치나요? (이러한 과정이 굉장히 빨라서 동시에 일어나는 것 처럼 보일 뿐)
현재 다익스트라와 관련된 강의까지 들어 놓은 상태이고 그 뒤는 아직 안 올라와서 나중에 들으려고 하는데 복습 겸 앞서 배운 부분을 공부해보려고 합니다 근데 어떤 걸 우선순위로 두고 공부해야 할지 잘 모르겠습니다. 그냥 백준에서 dfs bfs graph 풀면 될지 아니면 list queue 등 기초를 풀어보고 심화로 넘어가는게 좋을지 모르겠습니다 또한 알고리즘도 자주 나오는게 있고 덜 나오는게 있을텐데 뭘 먼저 풀어야할지 모르겠습니다 우선순위가 높은 알고리즘을 알려주시면 감사하겠습니다
선생님 안녕하세요 유형2로 들어와서 이제 visited를 2차원 배열로 만들기 시작하고 나서부터 계속 제가 헷갈리는게 선생님은 dfs 배열에 인자로 x,y가 아니고 y,x로 넘기시고 또 배열도 map[y][x]로 접근하시는 이유가 있으실까요? 보통 가로축을 x로 놓고 세로축을 y로 놓는 것으로 알고 있는데 혼자 고민해 봤을때는 지금 문제들이 계속 가로 세로 길이가 다르더라구요 그래서 또 2차원 배열로 생각해보면 가로축이 column이 되고 세로축이 row가 되어서 그런건가 싶기도 하고.. 유형 2 파트와서 계속 이 부분이 헷갈리네요 두서없는 질문이지만 궁금해서 여쭤봅니다! 감사합니다
c++로 수강중인 학생입니다.. 백준 숫자야구 문제 c++로 풀어주실 수는 없을까요..? 몇번 구현해보다가 멘탈이 터져버렸습니다.. 우선은 #include <iostream> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int numbers[1000]; int strikes[1000]; int balls[1000]; for (int i = 0; i < n; i++) { cin >> numbers[i] >> strikes[i] >> balls[i]; } int answer = 0; for (int a = 1; a < 10; a++) { for (int b = 1; b < 10; b++) { for (int c = 1; c < 10; c++) { int counter = 0; if (a == b || b == c || c == a) { continue; } for (int i = 0; i < n; i++) { int check = numbers[i]; int strike = strikes[i]; int ball = balls[i]; int strike_count = 0; int ball_count = 0; int check1 = check / 100; int check2 = (check / 10) % 10; int check3 = check % 10; // 스트라이크 계산 if (a == check1) { strike_count++; } if (b == check2) { strike_count++; } if (c == check3) { strike_count++; } // 볼 계산 if (a == check2 || a == check3) { ball_count++; } if (b == check1 || b == check3) { ball_count++; } if (c == check1 || c == check2) { ball_count++; } // 매칭 여부 확인 if (strike != strike_count || ball != ball_count) { break; } counter++; } if (counter == n) { answer++; } } } } cout << answer << '\n'; return 0; } 이렇게 풀기는 했는데 선생님이 가르쳐주신 방향하고는 살짝 다른 거 같습니다.
안녕하세요, 선생님의 강의를 잘 듣고 있는 1인 입니다. 1) 강의를 듣고 4번 문제를 아래와 같이 풀었는데요, 정답이 왜 0이 나오는건지, 어느 부분이 잘못된 건지 모르겠어서 질문드립니다. (5강에서 적으실때 line 18의 idx에 1을 더해주지 않으셨는데 이 부분은 +1을 빠트린게 맞으신거죠?) 2)또한, 어떤 경우에 global answer를 써주는지도 한번 다루어주셨으면 좋겠습니다. 3) line 8의 weight > B가 아닌 weight >= B가 되는게 더 맞는게 아닌지 질문드립니다. weight == B인 경우에 한 번 더 반복문을 돌면 이미 초과된 가방에 새로운 물건의 value를 추가해서 더하게 되는 것처럼 보이는데요, 혹시 제가 잘못 생각하고 있을까요?
선생님 안녕하세요! 강의 너무 잘 듣고 있습니다! 제가 2644번 문제를 혼자 아래 코드로 풀어보았는데 저는 선생님께서 count변수를 dfs 함수 인자에 준 것과는 다르게 처음부터 전역변수로 설정해서 조건이 맞으면 count 변수를 1씩 증가시키는 방향으로 작성을 했는데요. 이렇게 하니까 백준에서는 틀렸다고 나오더라구요. 둘 다 if문 안에서 조건이 맞으면 카운트 변수를 1씩 증가시키는건 같은거라고 생각이 드는데 (물론 다르겠지만..) 왜 카운트 변수를 인자로 넘겨줘야할까요? 감사합니다!