이런 트리가 있다면 높이가 3이 될텐데요. 높이 공식을 적용해보면 log₂N - 1 을 해서 2.xxx 가 나오는 거 같은데 왜 다른걸까요? 혹시 이 트리가 균형이진트리가 아닐까요? 3번 노드가 6번 노드랑 깊이 차이가 2가 나서 균형이진트리가 아닐까요? 그런데 선생님이 블로그에 예시로 보여주신 균형이진트리 모습에도 깊이가 2차이 나는 경우가 있긴 하더라구요...그래서 뭔가 이 이유는 아닌 거 같다는 생각이 들었습니다. 개념이 좀 헷갈리네요ㅠ 균형이진트리가 맞다면 왜 높이 공식으로 구한 값이랑 실제 높이랑 다른건지 궁금합니다!
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct Node{ int num; vector<int> links; }; Node A[40]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int num = 2; for (int i = 0; i < 19; i++){ vector<int> v; v.push_back(i+1); A[i] = {num,v}; num+=2; } for (int i = 0; i < 19; i++){ cout << A[i].num << " "; } } #include<bits/stdc++.h> using namespace std; typedef long long ll; struct Node{ int num; vector<int> links; Node(int NUM,vector<int> LINKS) : num(NUM),links(LINKS){} }; Node A[20]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int num = 2; for (int i = 0; i < 19; i++){ vector<int> v; v.push_back(i+1); A[i] = Node(num,v); num+=2; } for (int i = 0; i < 19; i++){ cout << A[i].num << " "; } } 첫번째 코드는 정상작동되는데, 두번째 코드는 error: no matching function for call to ‘Node::Node()’ 14 | Node A[20]; 이런 오류코드를 띄웁니다.두번째 코드에 이상이 없다고 생각하는데 왜 저런 오류가 나는지 궁금합니다.
package slidingwindow; import java.util.Scanner; public class MaximumSales { static int solution(int n, int k, int[] arr) { int p1 = 1; int sum = 0; int max = 0; for(int i = 0; i < k; i++) { sum += arr[i]; } // 최초 값을 max에 대입 max = sum; // 최초 p[0] + p[1] + p[2] .... 값 제외 // p[1] + p[2] ... 부터 while(p1 < n-k+1) { sum = sum - arr[p1-1] + arr[p1+k-1] ; p1++; max = max > sum ? max : sum; } return max; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.println(MaximumSales.solution(n, k, arr)); } }
강사님의 로직이 잘 이해가 가지 않습니다. 처음 문제를 풀 때 모든 블루레이를 사용해야 한다 고 생각해서 계속 오답이 나왔었는데요, 그 부분을 지우고 (cnt가 M과 같다는 조건문을 지우고) mid의 최소를 찾아 이분탐색 시켰더니 결국 통과는 했습니다. 그리고 강사님의 코드를 참고했는데, 동작방식이 잘 이해가 가지 않았습니다. 다음은 강사님 코드의 로직을 이해해보고 제 방식으로 수정해본 코드입니다. bool check(int mid) { if (mx > mid) return false; int temp = mid; int cnt = 0; for (int i = 0; i < n; i++) { if (mid - a[i] == 0) { ++cnt; mid = temp; continue; } else if (mid - a[i] < 0) { ++cnt; mid = temp; --i; } else mid -= a[i]; } if (mid != temp) cnt++; return cnt <= m; } else if (mid-a[i]<0) 의 조건문에서 i를 감소시켜서 다시 검사하게끔 하여 n+@의 순회를 합니다. 강사님은 이 부분을 최적화 하셔서 기존 14행과 같은 코드를 만드신 것 같은데요, 제가 제대로 이해한건지 (질의1) 제가 제대로 이해한게 맞다면, 처음부터 n회 순회만 하게끔 의도하셔서 코드를 작성하신건지 (처음 코드를 쓸 때부터 바로 저렇게 짜신건지) 아니면 최적화를 하다가 짜신건지 궁금합니다. (질의2) 저런 발상 자체를 해본적이 없어서 굉장히 낯선 코드를 보는 기분이었네요.. 감사합니다.
덩어리=최소공배수? 이고 ret = 35라는건 최소공배수가 7일때 7*5해서 최소공배수의 배수이고 ret-1/a[i] 하는건 28 만드는 과정인건 알겠는데 8:40 보면 ret%a[i]==0 있는 for문이 설명이 없고 잘 이해도 안가서 그러는 데 for(;;){if(ret%a[i]==0) if(temp==n))~ 이 부분 코드 설명 해 주실 수 있으신가요? 공유 소스 보기 (acmicpc.net)
import java.util.Scanner; // Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`, // then press Enter. You can now see whitespace characters in your code. public class Main { public int solution(String data, char what) { int count = 0; data = data.toLowerCase(); for (char a : data.toCharArray()) { if (a == what) { count++; } } return count; } public static void main(String[] args) { Main T = new Main(); Scanner scanner = new Scanner(System.in); String data = scanner.nextLine(); char what = scanner.nextLine().charAt(0); System.out.println(T.solution(data, what)); } } 1번 문제인데 이대로 제출하니까 틀렸다고 합니다. 원인을 모르겠어요 ㅠ
정확하게 출력이 되는것 같은데 오답이라고 나옵니다 선생님.. 제가 잘못 짠 부분이 있을까요?? import java.util.Scanner; class Main { static int n,total; static int[] array; static boolean flag; public static void main(String[] args) { Main T = new Main(); Scanner sc = new Scanner(System.in); n = sc.nextInt(); total =0; array = new int[n]; for (int i = 0; i < n; i++) { array[i] = sc.nextInt(); total += array[i]; } flag = false; T.DFS(0, 0); if (flag) { System.out.println("YES"); } else { System.out.println("NO"); } } void DFS(int L, int sum) { if (L == n) { return; } if (sum == total / 2) { flag = true; return; } if (sum > total / 2) { return; } DFS(L + 1, sum + array[L]); DFS(L + 1, sum); } }
search -> edit -> save 중 save에 궁금한 게 있습니다. int SaveNodeToFile(MYNODE* pNode)를 보면 파일에서 불러낸 경우만 고려돼있습니다. 신규 데이터를 찾아서 수정하는 경우에는 저장하지 않고 프로그램 종료 시 신규 데이터 일괄로 저장하는 방법을 써야할까요? pNode->bNew 값을 따져서 신규인지 구분하고 ab+모드로 파일 끝에 저장하는 건 생각했는데 파일에 저장했으니 bNew를 false로 수정해야하나? 수정하면 offset이 0이라 다시 검색할 때 offset이 0인 데이터를 찾을텐데? 그럼 offset 값은 어떻게 주지? bNew 값을 true로 저장하고 신규 데이터 일괄 저장할 때 덮어 써야하나? 라는 고민에 빠졌습니다. 어떤 방법이 좋을까요?
안녕하세요! 항상 강의 잘 보고 있습니다. 다름이 아니라, 아래 링크처럼 재귀 + 백트래킹으로 풀었음에도 불구하고 시간초과가 나는 이유가 감이 안옵니다. 어디 부분 때문에 시간 초과가 일어나는 것일까요?? https://www.acmicpc.net/source/share/a30df43331f9487eb25d43dfa7a24e95
모든 e를 찾아서 해당 위치를 배열에 담고, 루프를 돌려서 제일 최소 거리를 구해서 리턴 하게끔 만들었으나, 무언가 마음에 들지 않네요. 질문 올리고 강사님 강의를 바로 보겠습니다! function solution(str, str2) { const findAry = []; for (let i = 0; i < str.length; i++) { if (str[i] === str2) findAry.push(i); } return str.split("").map((v, index) => { const max = []; for (const value of findAry) { max.push(Math.abs(value - index)); } eturn max.sort((a, b) => a - b)[0]; }); } console.log(solution("teachermode","e"));
안녕하세요 큰돌님! 저는 prev를 처음부터 떠올리지 못해 vector로 trace를 시도했는데요. 테스트 코드는 잘 통과하는데 제출을하면 런타임에러(out of bound)가 뜨네요 ㅜㅜ 혹시 왜 범위 초과가 뜨는지 알 수 있을까요? http://boj.kr/c2069ab9e0d64c6ab7d86ce198e32e94
항상 답변 주셔서 감사합니다. lo hi가 작은 수 부터 시작한다면 lo~hi의 합이 n 보다 작은 경우 hi가 ++ 되는 것은 이해가 됩니다. 하지만 lo ---- hi 사이에 큰 차이가 있다고 가정할 경우 lo~hi의 합이 n 보다 크면 lo를 크게 하라고 하셨는데, hi를 크게 해주면 안되는 이유는 뭔가요?? lo~hi의 합이 n 보다 작으면 hi를 크게 하라고 하셨는데 lo를 작게 할 수 있지도 않나요?? else if (hi == p)break; 이 코드 의미를 좀만 더 자세히 설명 부탁드립니다.
선생님 안녕하세요 서브쿼리 관련해서 질문드립니다... 선생님이 내주신 inner join 연습문제를 풀어보면서 궁금한 점이 생겼는데 서브쿼리를 적용할시 from 절 이후에 서브쿼리가 들어가기도 하고 아니면 inner join 이후 ㅎ서브쿼리가 들어가는 경우도 있고 하는거 같은데.. 그 차이점이 잘 이해가 가질 않아서요.. 어떤 경우에서 그렇게 판단하여 서브쿼리를 넣는 것인지 확인부탁드립니다..
선생님 이 문제에 대해서 and p.start_date <= u.purchase_date and u.purchase_date <= p.end_date 이 부분을 왜 조건을 달아줘야 하는지 궁금합니다. 따로 문제에 명시되지 않은거같은데.. 확인부탁드립니다! select p.product_id , round(sum(u.units*p.price)/sum(u.units), 2) average_price from Prices p inner join UnitsSold u on p.product_id=u.product_id and p.start_date <= u.purchase_date and u.purchase_date <= p.end_date group by p.product_id;
강의 듣기전에 이렇게 풀어본 코드인데요. Counter로 미리 key,value를 채워두는 것 자체가 데이터최적화도 안되고 접근방법이 조금 엇나갔다는 건 알겠습니다. 그래서 이미 빈도수를 모두 주었기 때문에 (target-i != i)라는 조건이 추가로 생긴 것 같은데, if문에서 저런식으로 두가지 조건을 묶는 방식은 나쁜건가요? 공부를 시작하지 많이 안됐는데 뭔가 저런식으로 조건이 생기면 기분이 찝찝합니다. from collections import Counter def solution(nums,target): answer = [0]*2 nH = Counter(nums); for i in nums: if (target-i in nH) & (target-i != i): answer = sorted([i,target-i]) return answer return answer
import java.io.*; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { public static int solution(int[] arr, int K) { int max = 0; Queue<Integer> zeroPoint = new LinkedList<>(); int lp = 0, length = 0; for (int rp = 0; rp < arr.length; rp++) { if (arr[rp] == 0) { zeroPoint.offer(rp); // 0이 꽉 찼을 경우 if (zeroPoint.size() > K) { length = rp - lp; max = Math.max(length, max); Integer poll = zeroPoint.poll(); lp = poll + 1; } } } return max; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); int K = Integer.parseInt(st.nextToken()); int[] arr = new int[N]; StringTokenizer st2 = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { arr[i] = Integer.parseInt(st2.nextToken()); } System.out.print(solution(arr, K)); } } 6. 최대 길이 연속 부분수열 파트에서 이 코드가 정답이라고 나옵니다. 테스트 케이스가 부족해서 모든 문제에서 이런 현상이 발생하는건지, 이 문제에만 오류가 있는건지 궁금합니다. 반례 테스트 케이스 : 14 2 1 1 0 0 1 1 0 1 1 0 0 1 1 1 기댓값 : 7 출력값 : 6
증가하는 수열을 만들기 위해 반복문을 통해 좌 우를 번갈아가며 하나씩 지난 수와 비교하고 있습니다. 여기서 질문입니다. last=2 left = 4 right = 3 예를 들어 현재 상황이 위와 같을 경우 선생님께서 짜신 코드에서는 4와 3이 tmp에 추가된 후 정렬되어 수열을 만들것으로 예상되는데 원래대로 하면 left 4가 수열에 추가되고 다음에 순차가 돌아간 right는 3이기 때문에 수열에 포함될 수 없게 되는거 아닌가요?
해당 내용은 질문이 아닌 저와 같은 에러가 발생하시는 분들을 위해 남긴 글입니다..! Dev C++ 프로그램으로 vector를 선언 후 컴파일하는 과정에서 에러가 발생했습니다. 에러 내용은 다음과 같습니다. [Error] : in c++98 'a' must be initialized by constructor, not by '{...}' [Error] : no matching function for call to 'std::vector<int>::vector(<brace-enclosed initializer list>)' 발생 이유 : C++98은 표준 컨테이너를 초기화하는 초기화 목록을 지원하지 않아 C++2011 표준에 따라 적절한 컴파일 옵션을 설정하기 위함이라고 합니다.(정확하지 않을 수 있습니다!) 해결 방법 Tools -> Compile Options -> General 'Add the following~' 문장 바로 옆에 있는 박스 체크하기. 'Add the following~' 밑에 있는 박스 안에 "-std=c++11"(큰따옴표도 같이)를 작성. 하단에 있는 ok 버튼 누르기. 저는 이와 같은 방법으로 해결했습니다.