two_sum 문제에서 input으로 주어지는 nums에는 중복 원소가 없다고 가정하나요? 문제에 '같은 원소를 두 번 사용할 수 없습니다.'라는 조건이 있는데, 예를 들어, nums = [4,1,9,7,8,2], target=14인 경우에는 False를 출력해야 하는 반면, nums = [4,1,9,7,7,2], target=14인 경우에는 True를 출력해야 하니까 원소 중복 가능 여부를 여쭤보게 되었습니다!
큰돌님 안녕하세요. 강의 정말 잘듣고 있습니다!! 옛날부터 궁금한 점이 있었는데, 항상 헷갈리는 부분이 있어서 이렇게 질문 남기게 되었습니다. 보통 숫자 데이터를 다룰 때, C++에서 int형과 long long형 타입 두 개를 보통 사용하는 것으로 알고 있습니다. 데이터 범위에 따라서 두 개를 각각 나눠쓰면 되는 부분인데... 제가 궁금한 점은... 두 개가 그렇게 큰 차이가 없다면 숫자는 모든 걸 int형 말고, long long으로 다 선언하면 되지 않나? 라는 궁금증입니다!! 제가 혼자 공부를 해보니.. 32bit컴퓨터라면 int로 선언할때와 long long으로 선언할때 실행속도에서 차이가 생겼는데, 64bit로 넘어오면서 이 실행속도 차이도 없어졌다고 합니다. 시간복잡도(실행속도) 측면에서도 별로 그렇게 차이도 없고, long long으로 모든 숫자 타입을 지정하면 int형에서 발생하는 오버플로우 문제 등 장점들이 더 많다고 생각이 됩니다. 가장 큰 차이라고 생각이 드는 부분이 공간복잡도면인데, 코딩 테스트에서 공간복잡도는 크게 다루지 않으니.. 굳이 long long말고 int형을 쓰는 이유를 모르겠습니다. 정리: 숫자 데이터 타입을 구분할 때, 모든 걸 long long 타입으로 하면 안되나요?? long long타입으로 할 때, 안 좋은 면이 있나요?
1~9까지 입력을 받았는데, 어째서 이것이 45가 최대가 되는건가요? 문제에서 한 곡당 용량이 최대 5라고 나와있는건가요? 어디 부분에 의해 45라는 rt 값이 나왔는지 알 수가 없어서 질문합니다.. 보니까 1~9까지 다 더하면 45가 나오는 것 같은데, 9번 노래의 용량은 9가 되는거고 8번 노래의 용량은 8이 되는건가요?
안녕하세요. 제 나름대로 풀어봤는데 자꾸 시간초과가 걸려서 해설 코드 보고 제 코드를 조금 수정했거든요. 원래 제 코드에서 dfs알고리즘은 동일하고 해킹된 컴퓨터 수 계산해서 출력하는 것만 바꿨는데 맞네요. 그런데 제가 보기엔 별 차이 없을 것 같은데 어디서 차이가 발생하는지 궁금합니다. 원래 코드 http://boj.kr/5ff0dc6ee81c41e5acf41f41a2b3e857 수정한 코드 http://boj.kr/be9244a19d774c2ab6ce08343e52c94c
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 큰돌 강사님 문제를 보면 "사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다." 라는 조건이 있는데, 선생님이 제공해주신 풀이에서 어떻게 순서가 같은지 체크가 되는건지 이해가 되지 않아서요. 혹시 설명해주실 수 있나요??
안녕하세요. 요즘 프로그래머스에서 대부분 코딩 테스트를 제출하더라고요. 이 문제는 프로그래머스에서 어떻게 풀어야 하는지 모르겠어서 질문드립니다. int dfs(int y, int x) { if (y < 0 || x < 0 || y >= n || x >= m || a[y][x] == -1) return 0; if (visited[y][x]) { cout << -1 << "\n"; exit(0); } int &ret = dp[y][x]; if (ret) return ret; visited[y][x] = 1; for (int i = 0; i < 4; i++) { int ny = y + dy[i] * a[y][x]; int nx = x + dx[i] * a[y][x]; ret = max(ret, dfs(ny, nx) + 1); } visited[y][x] = 0; return ret; } 이 풀이에서, visited[y][x]를 확인 한 후 답을 출력하는데, 프로그래머스에서 exit(0)을 실행하면 program terminated unexpectedly 가 뜹니다. 어떻게 풀이해야 하나요??
#include <bits/stdc++.h> using namespace std; int N; map<int, vector<int>> mp; int tmp, d, ret; void removeAll(int key){ // if not leaf node -> recursive remove if(!mp[key].empty()) { for(int c: mp[key]) removeAll(c); } // erase itself mp.erase(key); } int main(){ cin >> N; // make graph for(int i = 0; i < N; i++){ mp[i]; cin >> tmp; if (tmp != -1) mp[tmp].push_back(i); } // input node to be deleted cin >> d; removeAll(d); if (mp.size() == 1) ret = 1; else if (mp.size() == 0) ret = 0; else { // for all key in map for(auto it: mp) { int key = it.first; // if the remaining value empty => plus if (mp[key].empty()) ret++; } } cout << ret; } 다음과 같이 map과 재귀를 풀어서 1068번 트리 문제를 풀었는데, 어디가 오답인지 감이 안옵니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강의를 듣기 전 풀어봤는데, 설명해주신 방법도 숙지하겠습니다. function solution(s) { let answer = ''; let stack = []; let contain = false for (let ele of s) { if (ele === '(') { contain = true stack.push(ele) } if (!contain) { answer += ele } if (ele === ')') { stack.pop() if (stack.length === 0) contain = false } } return answer }
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)이 되는건가요?