김영한 멘토님 안녕하세요 강의를 듣다가 질문이 있어서 질문 남깁니다! HashSet 자료구조를 사용해 객체를 저장할때, HashCode와 equals를 재정의 해야한다고 말씀해 주셨는데요. 정말 멘토님 말대로 재정의 하지 않으면 값이 중복되어서 저장되었습니다. 근데 궁금한것은 HashSet 자료구조이기에 HashCode를 사용하는것은 아는데, 그 이전에 자료구조가 Set의 기반의 자료구조인데 Set은 원래도 중복된 값을 허용하지 않는걸로 알고있습니다. 근데 왜 HashCode를 재정의해야 그때서야 값이 중복되어서 저장되지 않는것인가요? 애초에도 Set 기반의 자료구조인데 말입니다.
안녕하세요 시간초과가 나서 질문 드립니다 http://boj.kr/fc46d18e98374d0eb3e7ae35da228024 unorder map이 해시 맵이라 O(1)의 시간 복잡도를 갖는 걸로 알고 있는데 왜 시간 초과가 나는지 모르겠습니다...혹시 해시 충돌이 나서 그런걸까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 균형 이진트리의 경우 모든 노드에서 왼쪽 하위트리와 오른쪽 하위트리의 높이차이가 1이하여야 한다고 이해했습니다. 그러나 이번 영상 5:03초에 아래 그림의 트리구조가 균형 이진트리라고 설명해주셨는데, 제가 빨간색으로 표시한 노드를 기준으로 보았을때 왼쪽 하위트리 높이가 0 오른쪽 하위트리 높이가 2이기 때문에 높이차이가 2나기 때문에 해당 트리 구조가 균형 이진트리가 아니라고 판단하였는데, 제 개념에 오류가 있는것인지 궁금합키다..!
안녕하세요, 강의를 듣고 계신 여러분! 여러분의 학습을 돕기 위해 질문 안내를 드리고자 합니다. 1. chatGPT를 이용해보기 단순한 의문은 chatGPT를 이용해도 해답을 찾을 수 있는 경우가 종종 있습니다! 2. 강의의 어떤 부분에 대한 질문이고, 어떤 부분이 궁금한지 명확히 알려주세요! 강의의 어느 파트에서 의문을 느끼고, 어떤 부분이 궁금한지 를 명확히 제시해 주시면 답변에 도움이 됩니다! 자신은 어떻게 이해했는지 또한 적어주면 좋습니다! ex) 섹션5의 '그래프 순회 (DFS & BFS) [개념]' 강의 에서 DFS와 BFS 모두 그래프의 모든 노드를 탐색하는 알고리즘이라고 하셨고 시간 복잡도 또한 똑같다고 이해 했습니다. 그러면 DFS와 BFS 중에서 어떤 알고리즘이 더 효율적인지 구별하는 것은 의미가 없는 것일까요? 어느 파트 섹션5의 '그래프 순회 (DFS & BFS) [개념]' 강의 자신은 어떻게 이해했는지 DFS와 BFS 모두 그래프의 모든 노드를 탐색하는 알고리즘이라고 하셨고 시간 복잡도 또한 똑같다고 이해 어떤 부분이 궁금한지 DFS와 BFS 중에서 어떤 알고리즘이 더 효율적인지 구별하는 것은 의미가 없는 것일까요? 안녕하세요! 강의 잘 듣고 있습니다. 백준 1461 그리디 마지막 문제에 대한 질문이 있는데요. 보기 전에 풀어보긴 했는데, 두더지 잡다가 어떻게 된 느낌이긴 해요.. 음,, 아직 습관이 안 고쳐지기는 했는데 정의하고 분석하고 따져보고 그려본 다음에 해야 하는데,, 그 제가 처음 푼 방식은 리스트 요소를 지워가며 해결하는 방식인데요 양/음수가 m으로 떨어지지 않는 나머지 경우를 먼저 따져 합계에 더하고, 제거한 뒤 먼 데부터 다녀오는데, 최댓값을 계속 갱신해서 가장 먼 거리를 나중에 빼주는 방식으로 했어요.. m으로 나누어 떨어지지 않는 경우에 대한 처리를 나중에 추가했는데요 선생님의 코드가 어떻게 그 경우도 잘 처리하는 지 분석이 잘 안되어서.. 설명 부탁 드려요.. 아! 저번 설명 너무 감사합니다 더불어 약간 공부하는 루틴?이랄까? 그런 것도 말씀해 주실 수 있는 게 있다면 혹시 말씀 부탁드려요..(코테 공부도 그렇고 다른 것도 그렇고..) 아래는 제가 처음 정답 받은 코드입니다. (코드가 지저분함에 죄송해요..) import sys input = sys.stdin.readline # 방향을 결정하고 상자 들고 다음에 처음 갈 책 위치를 반환합니다. def getPos(arr): global direction maximum = max(map(abs, arr)) if maximum in arr: if len(arr) > m: direction = False if min(arr) >= 0: direction = True return 0 for i in range(len(arr) - 1, -1, -1): if arr[i] < 0: return i else: direction = True for i in range(len(arr)): if arr[i] >= 0: return i else: if len(arr) > m: direction = True if max(arr) < 0: direction = False return len(arr) - 1 for i in range(len(arr)): if arr[i] >= 0: return i else: direction = False for i in range(len(arr) - 1, -1, -1): if arr[i] < 0: return i return -1 n, m = map(int, input().rstrip().split()) arr = list(sorted(map(int, input().rstrip().split()))) cnt = 0; direction = True; reach = 0; plusCount = 0; minusCount = 0 #양수/음수 따로 헀어야 좋았는데, 하다보니 개수 세는 걸 만들었어요.. def count(): global plusCount, minusCount for i in arr: if i >= 0: plusCount += 1 elif i < 0 : minusCount += 1 count() #양수 m으로 나누어 떨어지지 않을 경우에 대한 처리입니다. if plusCount % m != 0: mini = min(i for i in arr if i >= 0) idx1 = arr.index(mini) idx2 = min(arr.index(mini) + (plusCount % m), len(arr)) reach = arr[idx2 - 1] for i in range(idx1, idx2): arr.remove(arr[idx1]) cnt += reach * 2 #음수 m으로 나누어 떨어지지 않을 경우에 대한 처리입니다. if minusCount % m != 0: maxi = max(i for i in arr if i < 0) idx1 = arr.index(maxi) idx2 = max(arr.index(maxi) - (minusCount % m), -1) far = abs(arr[idx2 + 1]) for i in range(idx1, idx2, -1): arr.remove(arr[idx2 + 1]) cnt += far * 2 reach = max(reach, far) # 이럴 필요 없는데, 돌면서 먼 데 구하고 그 안쪽? 지우는 방식으로 했어요.. while arr: pos = getPos(arr) far = abs(arr[min(len(arr) - 1, pos + m - 1) if direction else max(0, pos - m + 1)]) for i in range(m): if not arr: break arr.remove(arr[pos]) if not direction or pos == len(arr): pos = max(pos - 1, 0) cnt += far * 2 reach = max(reach, far) print(cnt - reach)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. <1. vector<string>자료형 사용> #include <bits/stdc++.h> using namespace std; //1159 - 농구 경기 int N; vector<string> name; int cnt[26]; vector<char> ret; int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); int flag=0; cin>>N; for(int i=0;i<N;i++){ cin>>name[i]; cnt[(int)name[i][0]-'a']++; } for(int i=0;i<26;i++){ if(cnt[i]>=5){ ret.push_back((char)i+'a'); flag=1; } } if(flag){ for(char c:ret) cout<<c; return 0; } cout<<"PREDAJA"<<'\n'; return 0; } <2. string 자료형 사용> #include <bits/stdc++.h> using namespace std; //1159 - 농구 경기 int N; string name; int cnt[26]; vector<char> ret; int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); int flag=0; cin>>N; for(int i=0;i<N;i++){ cin>>name; cnt[(int)name[0]-'a']++; } for(int i=0;i<26;i++){ if(cnt[i]>=5){ ret.push_back((char)i+'a'); flag=1; } } if(flag){ for(char c:ret) cout<<c; return 0; } cout<<"PREDAJA"<<'\n'; return 0; 다시 풀다 보니 이름을 계속 저장할 필요가 없음을 인지하여 string 자료형인 하나의 변수로 계속 초기화하도록 수정하였습니다. 하지만 첫 번째 코드가 실행되지 않는 명확한 이유를 잘 모르겠습니다. 설명해주시면 정말 감사하겠습니다. 좋은 강의 항상 감사드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 문제 조건에서 소괄호 사이의 존재하는 문자는 제거한다고 했는데 만약 소괄호 쌍이 안맞고 '(' 나 ')'가 남게되는 경우는 감안을 안해도되는건가요?
안녕하세요 선생님 🙂 이해가 되지 않는 부분이 있어서 질문 글 올립니다. 문제를 보니, 일단 완전탐색과 visited배열의 가중치를 증가시키는 방법이 떠올랐습니다. 완전탐색은 DFS로 구현(BFS는 복잡함) visited배열의 가중치를 증가시키려면 BFS를 사용 위의 2번 방법은 완탐을 사용하려면 불가능한 방법이기 때문에 함수에 cnt라는 int형 파라미터를 추가하여 풀이를 해보았습니다. 하지만 무언가에 막혀서 선생님 강의를 틀었는데요, 완탐을 사용하시면서 visited배열의 가중치를 증가시키시더라구요. 그동안 배웠던대로라면 이건 불가능한 방법이 아닌가요? 너무 헷갈립니다.. 팁 좀 주시면 감사하겠습니다!!
안녕하세요 선생님. 처음 문제를 풀 때 투포인터로 문제를 풀었습니다. (아래는 첫번째 풀이) http://boj.kr/3a10ce5dba1d4b2ba3ff506e08ea07cc 그런데 생각을 해보니, 2 2 2 7 7 7 이렇게 나오는 경우도 있지않을까? 싶어서 map을 사용해 다시 풀었습니다. (아래는 두번째 풀이) http://boj.kr/683ffbaa42d741caa47966d54cd814a1 투포인터로 짠 첫번째 로직은 2 2 2 7 7 7 의 경우 답이 3개가 나옵니다. 그리고 map으로 짠 경우, 9개가 나옵니다. 2가 3개, 7이 3개 가 있으니까 3 * 3 = 9 이렇게 나옵니다. 이렇게 두 풀이가 하나의 입력에 대해 답이 다른데 두 풀이 모두 정답으로 나옵니다. 제가 문제를 잘못이해한 것인지 왜 답이 다르게 나오는 두 풀이가 다 정답이 되는지 모르겠습니다 ㅜ..
-안녕하세요 선생님 강의 잘 듣고 있습니다. 제가 구현이 너무 안되어서....이 강의를 듣게 되었습니다..혼자 코드업 문제 등을 풀어보면 해결이 안되는 문제는 몇일씩 고민해도 시간만 가고 해결이 안되더라구요... 그래서 방법을 한번 바꿔볼까 해서 이 강의를 듣게 되었어요.. 선생님 강의를 전체 한번 쭉 다 듣고 다시 개인적으로 공부하는 방법이 어떤가 싶어 문의드립니다.. 알고리즘을 떠올리기가 힘듭니다...ㅜ 지금 DFS문제부터 듣고 있습니다.. 뒷 부분 강의부터 먼저 접해보면 앞부분의 문제는 좀더 쉽게 해결되지 않을까 해서요....;; 공부 방법에 대해 선생님께 조언을 좀 구하고저 합니다... 작성된 코드는 대부분 다 이해를 합니다..구현이 너무나 어렵습니다....ㅠㅠ 조언 부탁드립니다..
82161918번 소스 코드 (acmicpc.net) 우선 설명해주신 로직은 dfs와 인구이동을 한버에 하시는 것 같습니다. 제 로직은 while(true) 연합생성 연합생성이 않되면 break; 연합이 생성되면 인구 이동 입니다. 처음에 시도했을 때, 시간초과가 나서, BFS,DFS 모두 구현해보았는데, 어느 부분에서 더 줄일 수 있는 지 궁금합니다.
제곱수의 합문제요.. 6일 경우 제곱이 되려면 루트6밖에 안되는데 왜 2가 2로 떨어지는 약수의 개수로 카운팅되는지 이해를 못하겠네요… 또 3의 제곱 5의 제곱은 왜 고려안하는지도… ( 이미 이해 다 됐다고 가정해서 말씀하신건지도 모르겠습니다.ㅠㅠ ) 바보도 알고리즘 천재로 만들어주신다고 들어서 잘 알려주시면 감사드리겠습니다 ㅠㅠ
교안 질문 드립니다! Fill()파트를 공부 하다가 #include <bits/stdc++.h> using namespace std; int b[10][10]; int main(){ int *ptr = &b[0][0]; int size = 10 * 10; for(int i = 0; i < size; ++i) { *(ptr + i) = 1; } for(int i = 0; i < 10; i++){ for(int j = 0; j < 10; j++){ cout << b[0][0] << " "; } cout << "\n"; } return 0; } 이 코드에서 궁금한것이 생겼습니다. 원래대로라면 b[i][j]가 맞을것 같은대 신기하게도 이 코드를 출력 해도 1이 100번 출력이 되어서 이 부분이 궁금합니다.