묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
'1-L 재귀로 푸는 풀이' 재귀 시간복잡도 질문 있습니다,
http://boj.kr/35af496c1fb44628be4b5f27dde803d3문제 보자 마자 조합이 떠올라서 위처럼 풀었습니다.코드 자체에 대한 질문은 아니고 '재귀함수의 시간 복잡도를 어떻게 계산'하는지 궁금합니다.함수를 호출시 스택 프레임이 쌓이고 이것을 반환하고..등등의 작업 까지 생각하는 것은 아닌거같아 질문드립니다.재귀 함수의 깊이가 100이면 O(100)으로 시간 복잡도가 잡히는 것인지 궁금합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
정답과 다르게 코드를 짜봤습니다
안녕하세요 정답과 다르게 코드를 짜봤는데 코드 평가 해주실 수 있나요?? http://boj.kr/e426c9cd01624541b5251528546a8eae 강의 잘 보고있습니다 감사합니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교안 p33 cout 질문드립니다.
안녕하세요. 선생님.강의 교안 p.33에서cout << a << " " << "" << b << '\n';"" 빈 문자열을 넣으신 이유가 있을까요?빈 문자열을 빼도 출력 값은 동일하게 보이는데 어떤 의미로 넣으신건지 궁금합니다.혹시 cout 설명처럼 입력할 문자열을 넣을 수 있다를 설명하기 위해서 그런건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-C질문있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.#include<iostream> #include<algorithm> #include<vector> #include<utility> using namespace std; int n,person[14],ret =987654321,temp,temp1,visited[14],comp[14]; string s; vector<int> adj[14]; pair<int,int> dfs(int here, int value){//인접구 개수, 인구수 반환 visited[here] =1; pair<int,int> ret = {1,person[here]}; for(int there:adj[here]){ if(comp[there] != value) continue; if(visited[there]) continue; pair<int,int> temp_ = dfs(there,value); ret.first +=temp_.first; ret.second += temp_.second; } return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n; for(int i =1; i<=n;i++){ cin>>person[i]; } for(int i =1;i<=n;i++){ cin>>temp; for(int j =0; j<temp;j++){ cin>>temp1; adj[i].push_back(temp1); adj[temp1].push_back(i); } } for(int i =1;i<(1<<n)-1; i++){ fill(&comp[0],&comp[0]+14,0); fill(&visited[0],&visited[0]+14,0); int idx1=-1,idx2 =-1; for(int j =0; j<n;j++){ if(i&(1<<j)){ comp[j+1]=1; idx1 = j+1; } else idx2 = j+1; } pair<int,int> comp1 = dfs(idx1,1); pair<int,int> comp2 = dfs(idx2,0); if(comp1.first+comp2.first == n) ret = min(ret,abs(comp1.second-comp2.second)); } cout<<(ret==987654321 ? -1:ret); return 0; }저는 이렇게 백준에 제출했을때 맞았다고 나오는데 제 vscode에서는 예제에서 밑에 만큼 입력하면 -1이 출력되어 끝나 버립니다 왜 그런건가요..? 다른 문제 풀때도 정답은 맞지만 제가 실행하면 도중에 입력을 그만 받습니다.. ㅠㅠ6 5 2 3 4 1 2 2 2 4 4 1 3 6 5
-
해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
특정 문자 뒤집기
c@fa$ 가 입력 되었을 때, 제 생각에는결과가 그대로 나와야 하지 않나 싶은데, (짝이 되는 알파벳이 없음) a@fc$이 나오는 이유가 궁금합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-J BFS 코드 효율성 질문
http://boj.kr/b3912cd4b65448baa4a27bea951494cb안녕하세요, 큰돌님.해당 문제를 queue를 이용한 BFS로 풀었습니다.더 효율적으로 수정할 부분이 있을까요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
우선순위 큐를 활용해서 문제를 해결 했는데 이처럼 해도 괜찮을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 위험도가 높은 환자 순서로 우선순위 큐를 만들었습니다. 정답으로 찾아야 하는 환자의 위치의 번호를 이동해가면서 현재 치료 받는 환자가 찾아야 하는 환자인지를 체크 했고요. 우선순위 큐에서 poll한 값을 통해서 현재 대기하고 있는 환자가 현재 치료를 받아도 되는지(우선순위가 가장 높은지)를 체크 했습니다. public int solution(int[] input1, int m) { Queue<Integer> q = new LinkedList<>(); Queue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder()); int seq = m; for (int i : input1) { q.offer(i); pq.offer(i); } int cnt = 0; while (true) { Integer poll = q.poll(); seq--; if (Objects.equals(pq.peek(), poll)) { cnt++; if (seq == -1) { break; } pq.poll(); } else { q.offer(poll); if (seq == -1) { seq = q.size() - 1; } } } return cnt; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-H ret 초기값 질문 있습니다.
선생님 코드에서 ret의 초기값을 -1000000 으로 주셨는데 이유가 궁금합니다.만약 n이 100000, k가 99999, 모든 temp가 -100일 때 0~99999까지 더하면 -1000000보다 작은 값이 나오게 되어 최대 값을 제대로 못찾을거같은데 어떻게 코드가 통과한 것인지 궁금합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-H 하나의 문자를 입력 받을 때 런타임 에러
안녕하세요, 큰돌님.http://boj.kr/f7198ad0aa0740abb6a3d6f9cb33c43e2-H 에서 입력 받은 s가 "a" 같은 하나의 문자일 때 런타임 에러가 떴습니다. 계속 수정하다 보니 모음 or 자음 3개 연속 조건 부분의 코드 문제인 것 같았습니다. for(int i = 0; i < s.size() - 2; i ++)그래서 s가 하나의 문자일 때를 나눠서 계산하였습니다. // s가 문자일 때 if(s.size() == 1) 이렇게 하니 맞긴 했는데 코드가 너무 난잡해진 것 같습니다...기존 방식의 런타임 에러의 이유제 코드보다 더 좋은 해결 방안이 있을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2Q 질문 있습니다!
안녕하세요 큰돌님!2Q 를 풀다가 반례를 못찾겠어서 질문드립니다!https://www.acmicpc.net/source/90805248제가 제출한 코드인데, 큰돌님의 풀이보다 복잡하고 비효율적인 것은 알지만 이 풀이가 왜 틀렸는지 알고싶어서 여쭤봅니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
스택만을 이용한 풀이
선생님의 풀이를 보고 이건 진짜 못떠올릴 것 같은데? 라는 생각이 들었습니다.배열에 마킹을 하면서 푸는 풀이는 떠올릴 수 있을 것 같은데, 스택만 이용한 풀이에서 -1을 넣어서 풀이하는 방식은 정말 감탄이 나오네요. 저도 스택만을 이용하는 비슷한 풀이를 떠올려서 '((()))'가 6이 나오게 하는 방법은 고안을 했는데 '((()))()'가 8이 되게 하는걸 처리하기가 너무 어렵더라구요. 하지만 -1을 넣어두면 전부 처리가 되네요.그리고 올바르지 않는 문자열이 오면 그 인덱스를 넣어주면 -1을 넣은 것과 동일하게 뒤의 문자열도 판별할 수 있다니...이 풀이를 보고 이런 아이디어는 정말 못 떠올릴 것 같다는 생각이 들었습니다. 이런 아이디어를 잘 떠올리기 위해서 어떻게 연습하면 좋을까요?
-
미해결2주만에 통과하는 알고리즘 코딩테스트 (2024년)
#1090번 문제 반례가 궁금합니다.
from copy import deepcopy def init_sort_checker(checkers): tmp_list = [] sorted_sum_list = [] for idx, chk in enumerate(checkers): for i, tgt in enumerate(checkers): if idx == i: #본인으로 가는 값은 제외 continue x_val = abs(chk[0] - tgt[0]) y_val = abs(chk[1] - tgt[1]) # price, [src, tgt] 순 정렬 tmp_list.append([x_val + y_val, [idx, i]]) tmp_list.sort(key=lambda x: x[0]) # price 값 적은 순서대로 정렬 sorted_sum_list.append(deepcopy(tmp_list)) tmp_list = [] return sorted_sum_list def sort_sum_target(sorted_sum_list, k): lowest_price = 1000000*k target_idx = -1 for idx, line in enumerate(sorted_sum_list): cnt = 0 line_price = 0 for price in line: if cnt >= k-1: break line_price = line_price + price[0] cnt += 1 if line_price < lowest_price: lowest_price = line_price target_idx = idx return target_idx def k_tgt_process(k, sorted_tgt, sorted_sum_list): tgt_line = sorted_sum_list[sorted_tgt] tgt_loc = [] for i in range(k-1): tgt_loc.append(tgt_line[i][1]) return tgt_loc def k_sorting_process(tgt_loc, checkers): tgt_list = [] for tgt in tgt_loc: tgt_list.append(tgt[0]) tgt_list.append(tgt[1]) tgt_list = list(set(tgt_list)) x_list = [] y_list = [] tgt_checkers = [] for tgt in tgt_list: x_list.append(checkers[tgt][0]) y_list.append(checkers[tgt][1]) tgt_checkers.append(checkers[tgt]) x_list.sort() y_list.sort() if len(x_list)%2 == 0: #짝수 x_chk_point = [int(len(x_list)/2-1),int(len(x_list)/2)] else: # 홀수 x_chk_point = [int(len(x_list)/2)] if len(y_list)%2 == 0: #짝수 y_chk_point = [int(len(y_list)/2-1),int(len(y_list)/2)] else: # 홀수 y_chk_point = [int(len(y_list)/2)] #모아볼 위치의 case 집합 chk_point_list = [] for x_chk in x_chk_point: for y_chk in y_chk_point: chk_point_list.append([x_chk,y_chk]) # 각 checker 위치에서 좌표로 이동하는데 드는 값 계산 ttl_price_list = [] for chk in chk_point_list: x_tgt = chk[0] y_tgt = chk[1] price_list = [] for checker in tgt_checkers: x = checker[0] y = checker[1] if x_list[x_tgt] > x: x_price = x_list[x_tgt] - x else: x_price = x - x_list[x_tgt] if y_list[y_tgt] > y: y_price = y_list[y_tgt] - y else: y_price = y - y_list[y_tgt] price = x_price + y_price price_list.append(price) price_list.sort() ttl_price_list.append(price_list) return ttl_price_list def TestCases(N): checkers = [list(map(int,input().split())) for _ in range(N)] sorted_sum_list = init_sort_checker(checkers) output_str = '0' for k in range(2, N+1): min_price = 2000000 sorted_tgt = sort_sum_target(sorted_sum_list, k) tgt_loc = k_tgt_process(k, sorted_tgt, sorted_sum_list) ttl_price_list = k_sorting_process(tgt_loc, checkers) for n_list in ttl_price_list: tmp = 0 for idx in range(k): tmp = tmp + n_list[idx] if tmp < min_price: min_price = tmp output_str = output_str + ' ' + str(min_price) tmp_str = list(map(int,output_str.split())) # print(output_str) print(*tmp_str) N = int(input()) TestCases(N) 다음과 같이 코드 작성해봤는데, sample input에 대한 답은 다 도출되지만문제 제출하면 답이 틀리다 나오네요..반례나 코드상의 오류를 도와주실 수 있을까요? [사용해본 input/output]4 1 1 2 1 4 1 13 1 0 1 3 14 4 13 13 16 14 15 18 15 30 0 4 8 24 5 3 2 6 9 3 16 14 6 17 14 0 10 17 31 47 5 3 2 6 9 6 13 13 6 17 14 0 4 14 24 40 4 15 14 15 16 14 15 16 15 0 2 3 4 2 4 7 4 7 0 0 4 1 101 2 101 200 101 201 101 0 1 199 398
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3- k 시간복잡도
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 정해를 보며 복습중인데 while 문을 통틀어 NxM 맵을 탐색하니 시간복잡도는 O(NxM)이 맞나요?while(true){ if(move_swan()) break; water_melting(); waterQ = water_tempQ; swanQ = swan_tempQ; Qclear(water_tempQ); Qclear(swan_tempQ); day++; }
-
해결됨38군데 합격 비법, 2025 코딩테스트 필수 알고리즘
5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2 질문입니다.
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 5-4. 카카오 신입 개발자 블라인드 채용 1차 코딩테스트 - 2어떤 알고리즘을 학습하고 계신가요?여기까지 이해하신 내용은 무엇인가요? 2. 어려움을 겪는 부분어느 부분에서 막히셨나요? W = "))()(" 케이스에 대해서, u와 v로 나누어야 하는데 u는 더이상 나눌 수 없는 균형잡힌 괄호 문자열이어야 된다고 했습니다, 하지만 해설로 제공해주신 풀이로 풀 때에는 W = "))()(" 가 애초에 균형잡힌 괄호 문자열이 아니기 때문에 u도 균형잡힌 괄호 문자열이 되지 않는다고 이해했습니다. (W의 문자열 길이가 홀수인 경우에는 )와 (가 모두 짝수 개수만큼 있을 수 없다고 생각했습니다.) 해당 문제의 원 링크에서 제공해주신 코드를 제출했을 땐 정답이 나오는데, 문제 설명 중에서 어떤 조건을 보고 W가 균형잡힌 문자열이 아닐 수도 있다는 것을 알수 있으며, u가 무조건 균형잡힌 문자열이 아니어도 된다는 것을 알 수 있는건가요?코드의 어떤 로직이 이해가 안 되시나요?어떤 개념이 헷갈리시나요? 3. 시도해보신 내용문제 해결을 위해 어떤 시도를 해보셨나요? 제가 짠 코드와 제공해주신 해설 코드 중 차이점이 W를 u와 v로 나누는 부분에 있음을 알게되었고, 제 코드는 W가 무조건 균형잡힌 괄호 문자열인 경우에 대해서만 풀리게 되어있습니다. 에러가 발생했다면 어떤 에러인가요?from collections import deque def is_this_correct_parentheses(string): N = len(string) left_parentheses_num = 0 for s in string: if s == "(": left_parentheses_num += 1 if left_parentheses_num == N-left_parentheses_num: return 1 else: return 0 def is_this_balanced_parentheses(string): stack = [] stack.append(string[0]) string = string[1:] for s in string: tmp = s if len(stack) != 0 and stack[-1] == "(" and tmp == ")": stack.pop() else: stack.append(tmp) if len(stack) == 0: return 1 else: return 0 def u_string_processing(u): u = u[1:-1] tmp_u = "" for i in range(len(u)): if u[i] == "(": tmp_u += ")" else: tmp_u += "(" return tmp_u def get_correct_parentheses(balanced_parentheses_string): W = balanced_parentheses_string if W == "": return "" idx = 0 for i in range(1, len(W)): tmp_u = W[:i] if is_this_correct_parentheses(tmp_u) == 1: idx = i break if len(W) == 2: idx = 2 u = W[:idx] v = W[idx:] if is_this_balanced_parentheses(u) == 1: processed_v = get_correct_parentheses(v) return u+processed_v elif is_this_balanced_parentheses(u) == 0: tmp_string = "(" processed_v = get_correct_parentheses(v) tmp_string += (processed_v + ")") tmp_string += u_string_processing(u) return tmp_string return W 이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊
-
미해결김영한의 실전 자바 - 중급 2편
hashCode() 오타? 질문
강의 자료 보면, 전부 다 해시코드 만들 때, Object.hashCode()를 사용한다고 되어있는데, 막상 equals()와 hashCode() 오버라이딩된 것을 보면, Objects인데, 둘은 서로 다른 것 아닌가요? 오타 아닌가요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
equals() 사용 시 시간 복잡도 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님 좋은 강의 항상 감사드립니다.해당 문제에서 시간 복잡도 관련 질문이 있습니다!map의 equals() 는 내부적으로 O(n)의 복잡도를 가진 메소드로 알고 있습니다! 내부 구현 코드도 entrySet을 통해서 반복문으로 찾는 과정이 있는 것 같은데요!그렇다면 for문 안에 equals()를 사용할 경우 O(n^2)이 되는 것이 아닌지 질문 드리고 싶습니다! equals가 평균적으로 n 까지 가지 않기 때문에 제외 되는 것일까요?추가적으로 equals() 를 사용하지 않고 풀이를 해봤습니다! 채점을 했을 땐 통과를 하였는데.. 혹시 이 방법에 예외가 있을까요? import java.util.HashMap; import java.util.Scanner; public class Main { private static void solution(String s, String t) { int idx1 = 0; int answer = 0; int cnt = 0; HashMap<Character, Integer> targetMap = new HashMap<>(); for (char c : t.toCharArray()) { targetMap.put(c, targetMap.getOrDefault(c, 0) + 1); } for (int i = 0; i < s.length(); i++) { char key = s.charAt(i); if (targetMap.containsKey(key)) { int value = targetMap.get(key); if (value == 0) { cnt--; } targetMap.put(key, --value); if (value == 0) { cnt++; } } if (i >= t.length()) { char backKey = s.charAt(idx1++); if (targetMap.containsKey(backKey)) { int value = targetMap.get(backKey); if (value == 0) { cnt--; } targetMap.put(backKey, ++value); if (value == 0) { cnt++; } } } if (cnt == targetMap.size()) { answer++; } } System.out.println(answer); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); String t = sc.next(); solution(s, t); } }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K 어떤 반례가 있는지 모르겠습니다
http://boj.kr/33d85a5593ae445392cb5242ad169a89
-
미해결김영한의 실전 자바 - 중급 2편
자료구조, 알고리즘
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]자료구조, 알고리즘이 재밌어야 할까요? 개발자가 되려면요
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-V 누적합 질문
안녕하세요!!누적합 공부하면서 좀 헷갈리는 부분과 예시코드랑 다른 부분이 있어서 이 두개에 대해서 질문하려고합니다.http://boj.kr/88f78b9449fb462e99bbed15e9875b5f이게 제가 작성한 코드인데요,피자가원형이고, 예를 들어 7,2,2,2,1 이 있다고 치면 확장해서 7,2,2,2,1,7,2,2,2,1 이렇게 만드는 과정이 2*m 즉 2배 확장하는걸로 이해했는데요, (2*m)-1 만 확장해도 상관은 없는거죠? 선택할 수 잇는 시작점의 마지막 위치가 1이고 그 뒤로 넘어가 7을 선택하게되면 결국 맨 처음 선택했던 시작점과 동일해지기 때문에 이런것같은데, Chatgpt를 통해서 의견을 묻는데 반드시 2*M 의 구간확장이 필요하다해서 의미가 있나 싶어 질문드립니다.또한 map에다가 누적합들을 더하는 과정이 예시 코드에서는interval개를 선택할거고, start지점을 interval과 같게 설정하는 부분이 잘 이해가 안됩니다. 저는 i~j까지의 합을 size만큼 펼쳐가면서 더햇는데요, 예시 코드에서 start를 꼭 interval로하는 이유가 있나요? 물론 코드가 정상적으로 동작해서 같은 결과를 내는건 알겠는데, start = 1; start<= n 으로 하지 않는 이유가 궁금합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-H 질문드립니다.
안녕하세요, 큰돌님이 강의에서 설명해주신 코드에서 한가지 사소한 질문이 생겨 글 남기게 됐습니다.같은 글자가 연속으로 나오면 안되는 조건을 위해서 큰돌님께서 prev를 -1로 초기화 하기 i가 0일 때 제외하고 prev와 현재 idx를 비교해서 같으면 flag = 1 이 되도록 하셨는데요.처음에 코드를 봤을 때 prev를 s[0]이 아니라 일부러 -1로 두신 이유를 저는 i >= 1 조건을 생략하기 위해서 혹시라도 i가 0 일때의 idx와 prev가 같은 경우가 생기지 않도록 해서 i = 0일 때 조건을 확인해도 어차피 prev == idx가 거짓이 되도록 한걸로 이해했거든요.(저도 비슷하게 prev를 'a'-1로 초기화하고 for문에서 i=0을 skip하지 않고 다 확인하도록 했습니다. http://boj.kr/8e848001c5b443cd85c5a78d65af69c7)하지만 강의에서 말씀하신 건 첫번째 i=0일때 비교를 피하기 위해서 i>=1을 넣었다고 하셔서 prev를 s의 첫번째 원소가 아닌 -1을 초기화 하는 부분과 i = 0 일 때 prev와 idx를 비교하는 걸 넘어가는 부분이 상충되는 부분이 있어 질문드렸습니다.