묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 기본편
super-생성자 강의 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.ClassA에 매개변수가 없기 때문에 명시적으로 호출하지 않아도 자동으로 호출된다고 하셨는데, 그렇다면 아래 코드에서도 명시적으로 부모 클래스를 호출하지 않아도 되지 않을까 싶어서 문의 글 남겨드립니다! 컴파일 진행 시 정상 작동되고, 생각해 보아도 왠지 필요 없을 것 같다고 생각이 들어서 질문 글 한 번 남겨드립니다! public class ClassB extends ClassA { public ClassB(int a) { this(a, 0); System.out.println("ClassB 생성자 a = " + a); } public ClassB(int a, int b) { //super(); <-생략 가능하지 않나요? System.out.println("ClassB 생성자 a = " + a + ", ClassB 생성자 b = " + b); } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G 질문입니다.
안녕하세요..제가 이문제를 다시 푸는 과정에서reverse함수를 사용해서풀어보았는데요예제는 다 맞는데 왜틀리는지 모르겠습니다...답변 부탁드립니다.http://boj.kr/ee37f6b6daa14f158949673b90e65815 #include <iostream> #include <algorithm> #include <vector> using namespace std; vector<string> solution(const int N, const string& str, const vector<string>& v) { vector<string> answer; size_t pos = str.find('*'); string pre = str.substr(0, pos); string suf = str.substr(pos + 1); reverse(suf.begin(), suf.end()); // cout << "pre = " << pre << ", suf = " << suf << '\n'; // test for (const string& s : v) { string rs(s); reverse(rs.begin(), rs.end()); if (s.find(pre) == 0 && rs.find(suf) == 0) answer.push_back("DA"); else answer.push_back("NE"); // cout << "str = " << s << "\nrstr = " << rs << '\n'; // cout << "answer = " << answer.back() << "\n\n"; } return answer; } int main() { int N; string str; cin >> N >> str; vector<string> arr(N); for (string &s : arr) cin >> s; vector<string> answer = solution(N, str, arr); for (string& s : answer) cout << s << '\n'; return 0; }
-
미해결[D.P.2(DappProject2)] 디앱 프로젝트2(Klaytn 네트워크를 활용한 NFT 생성 및 판매)
metadata를 읽어오지 못해요 ㅠ
refersh metadata를 몇번이고 해보고 캐시 지우고 해봐도 이미지와 name, description이 업데이트 되지 않습니다. ㅠmint 해서 tokenURI실행하면 아래와 같이 나옵니다.해당 url로 접근하면 json이 잘 나오고 imgaeurl접속해도 이미지가 잘 나오는데 opensea testnet에는 아무 정보도 업데이트 되지 않아요 ㅠ 아래는 ㄴ소스 코드입니다. // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; contract MintGemToken is ERC721Enumerable{ //메타 data json폴더 경로 string public metadataURI; constructor(string memory _name, string memory _symbol, string memory _metadataURI) ERC721(_name,_symbol){ metadataURI = _metadataURI; } struct GemTokenData{ uint gemTokenRank; uint gemTokenType; } // 토큰 id => 랭크,타입 mapping(uint => GemTokenData) public gemTokenData; //* ERC721에 구현되어있는 메서드를 override //tokenURI -> metadata가 저장되어있는 json의 주소를 던져줌. function tokenURI(uint _tokenId)override public view returns(string memory){ string memory gemTokenRank = Strings.toString(gemTokenData[_tokenId].gemTokenRank); string memory gemTokenType = Strings.toString(gemTokenData[_tokenId].gemTokenType); //argument들을 하나로 합쳐줘서 문자열 리턴 -> metadata json uri return string(abi.encodePacked(metadataURI,'/',gemTokenRank,'/',gemTokenType,".json")); } function mintGemToken() public { uint tokenId = totalSupply()+1; // 발행자에게 tokenId의 토큰 발행 -> 일단 현재는 하드코딩 gemTokenData[tokenId] = GemTokenData(1,1); _mint(msg.sender,tokenId); } }
-
해결됨이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
자막 오탈자 제보합니다.
Part4-4강의 오탈자 입니다. 0:25 개선에서 → 개선해서1:08 C++를 → C++로25:15 호출된 → 호출될 or 호출되는28:13 가져오던→가져오는
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
섹션1 - UI, Data 강의 화면 원래 안보이나요?
수강 시작했는데 섹션1 UI, Data 강의 화면이 안나오네요
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
BeanPropertySqlParameterSource
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]BeanPropertySqlParameterSource를 사용하려면해당 DTO나 도메인에 getter setter or @Data가 필수로 있어야 하는 게 맞겠지요?
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
@Role 어노테이션은 무슨 역할인가요?
@Bean 등록할 때 사용이 되던데왜 쓰는건지 궁금한데 제가 강의 보다가 놓친건지 ㅠㅠ 궁금합니다
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
UI 리소스 사용문의
몬스터랑 나머지 리소스 전부 UI랑 사용해도 문제없나요 ??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
정적화면 제공하는 상황
좋은 강의 감사합니다 !매번 똑같은 화면(안내문구나 안바뀌는 정보들?)을 제공할 땐 서버측에서 타임리프 사용하여 랜더링해주면 편한거고, 그 외에 정보가 매번 바뀌는 등 동적인 상황에선 클라이언트 측에서 랜더링하는게 좋다 이게 맞는거죵?? 현업에서도 이런게 어느정도 나뉘어있나요? A는 서버에서 타임리프로 내려주세요~ B는 클라이언트에서 CSR하세요~ 이런게 ??현업에서도 백엔드측에서 타임리프를 사용하여 SSR한다면 백엔드 개발자도 타임리프 관련 문법(html 등)을 어느정도 알아야 하나요?
-
미해결실전! Querydsl
db 종속 insert(암복호 관련)문 관련 하여 문의드립니다.
PostgreSQL 종속된 insert쿼리를 날려야 하는데query.insert(user).columns(....)...QueryDSL 문서를 보면 컬럼에 user.name 이런식으로 넣어주라고 되어있는데Entity는 private로 생성해야 하는 걸로 아는데 어떻게 처리 해야 할지 막막합니다.사용할 쿼리는 아래와 같습니다.insert into user (user.name, user.email)value(encode(encrypt(convert_to(유저명,'utf-8'), 'key', 'aes'), 'hex'),encode(encrypt(convert_to(유저메일,'utf-8'), 'key', 'aes'), 'hex'));감사합니다.
-
미해결김영한의 실전 자바 - 기본편
VarChange1 예제 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 다름 아니라 VarChange1 예제 관련 질문 드립니다. int a = 10int b = a 이때, a =20으로 한다면, 우선 변수 a에 20이 들어가고, int b = a이니변경된 a의 값이 복사 되어 b값이 업데이트 되어야 하는 것 아닌가요?잘 이해가 되지 않습니다. 프로그램 상 위에서부터 순차적으로 코드를 읽어, 이미 int b = a가 실행되었고, loop를 돌리거나 b = 값 과 같이 따로 적어주지 않는 이상 b의 값이 업데이트 되지 않는 것으로 이해해도 될까요?앞에서 Java - start 편에서는 이해가 되던게, 갑자기 이해가 안됩니다.
-
미해결Python 입문자를 위한 강의
강의수강 완료하였는데 진도율이 100%가 안됩니다
강의 수강을 완료하였는데 나의 진도율이 98%에 머물러 있습니다100%가 안되는 이유가 궁금합니다
-
미해결
인프런 할부 결제방법
강의가 비싸서 할부로 결제하려는데, 어디서 설정이 가능한가요?일반 결제창에는 할부 관련 내용이 없고, 강의에서도 할부를 추천하는데....
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
자바와 스프링 버전 변경 방법
수업에 사용되는 파일의 스프링 버전을 변경하려면 어떻게 해야하나요?버전이 17일 때는 한글이 나오는데 그 외의 버전은 한글이 깨져서 나옵니다ㅠㅠ수업에 사용되는 파일의 버전은 자바 11, 스프링 2.4.4입니다.
-
해결됨쉽게 설명하는 AWS 기초 강의
PPT제공
강의 PPT를 받아보고싶은데 방법이 없을까요?
-
미해결김영한의 실전 자바 - 중급 2편
List.of 질문
안녕하세요.Arrays.asList()는 ArrayList를 반환하는 걸 확인했는데List.of()는 결과적으로 new ListN<>(tmp, false); 다음과 같은 ListN 객체를 반환하던데 이게 어떤 것인지 궁금합니다.List 구현체로 알고 있으면 될까요 ?
-
미해결입문자를 위한, HTML&CSS 웹 개발 입문
깃허브 링크 주소
안녕하세요 강의 감사드립니다깃허브 주소를 못찾아서 링크를 받을 수 있을까요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
합이 같은 부분 집합 문제 질문 드립니다.
안녕하세요, 강의 잘 듣고 있습니다.작성한 코드 실행 시 테스트 케이스 4번에서만 오답처리 되어 확인을 해봤습니다.4번째 테스트 케이스인 9, [3 6 13 11 7 16 34 23 12] 를 입력한 후 디버깅을 해본 결과실제로 중복집합이 발생하는 것으로 확인됐습니다.제 코드 상에 어떤 부분이 문제가 됐는지 알고 싶습니다.import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { static int level; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int size = sc.nextInt(); int max = 0; int dep[] = new int[size + 1]; level = size; for (int i = 1; i < dep.length; i++) { int val = sc.nextInt(); dep[i] = val; if (val > max) { max = val; } } int[] check = new int[max + 1]; Map<Integer, Integer> map = new HashMap<>(); dfs(1, check, dep, map); Collection<Integer> values = map.values(); boolean duplicate = false; for (int i : values) { if (i != 1) { System.out.println("YES"); duplicate = true; break; } } if (!duplicate) { System.out.println("NO"); } } public static void dfs(int l, int check[], int[] depth, Map<Integer, Integer> map) { if (l == level + 1) { int sum = 0; for (int i = 1; i < check.length; i++) { if (check[i] == 1) { sum += i; } } if (sum > 0) { map.put(sum, map.getOrDefault(sum, 0) + 1); System.out.println("Sum: " + sum + ", Count: " + map.get(sum)); } } else { check[depth[l]] = 1; dfs(l + 1, check, depth, map); check[depth[l]] = 0; dfs(l + 1, check, depth, map); } } }
-
미해결김영한의 실전 자바 - 중급 2편
Set문의
안녕하세요.Set관련 2가지 질문드립니다.1. 문제풀이에서 보면 Set의 내용을 출력할 때 for-each문으로 Set의 내용을 출력하였는데, 기본적인 인덱스 접근은 아닐텐데 어떻게 for-each문으로 값을 찾아서 출력이 가능한 걸까요 ?(강의에 나온대로 hashIndex를 활용한 접근이라면 어느 index에 매핑될 지 모르니 내부에 가지고 있는 배열의 capacity만큼 다 돌아야 할 거 같아서요. 그렇다면 배열의 capacity는 default인지 아닐지 모르는데 이걸 일일히 확인하고 for문을 돌린다는 것도 이상하고요.)LinkedList 때도 문의 드린 건데 Set도 보면 toString을 따로 구현체들이 오버라이딩 하고 있지 않고 set.toString()을 찍어봐도 object에서 선언한 toString()을 가리키던데 어떻게 다음과 같이 출력이 될까요 ? System.out.println(set);[20, 10, 30]아래 질문헀던 건데 답변을 못 받아서 재질문드립니다.HashSet의 toString 코드를 보다 문의사항이 있어 질문합니다. @Override public String toString() { return "MyHashSetV2{" + "buckets=" + Arrays.toString(buckets) + ", size=" + size + ", capacity=" + capacity + '}'; }다음과 같이 되어 있고 출력을MyHashSetV2{buckets=[[Member{id='hi'}, Member{id='JPA'}], [], [], [], [], [], [Member{id='spring'}], [], [], [Member{id='java'}]], size=4, capacity=10} 이렇게 하니까 Arrays.toString(buckets) 부분이[[Member{id='hi'}, Member{id='JPA'}], [], [], [], [], [], [Member{id='spring'}], [], [], [Member{id='java'}]]이 부분일텐데 따라 들어가면 toString 오버라이딩 된 형태가 toString(Object[] a) {다음과 같고 실제 스트링으로 만드는 코드는StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0; ; i++) { b.append(String.valueOf(a[i]));이거인데요.여기서 말하는 a[i]는 LinkedList<Object>[] set의 각각의 인덱스에 위치한 LinkedList<Object> 일텐데 LinkedList나 상위의 List를 타고 들어가봐도 따로 toString 메서드를 살펴볼 수 없습니다. String.valueOf(LinkedList)가 어떻게 동작하는건가요 ? 출력물 보면 각 LinkedList안에 객체로 들어간 member의 toString을 출력하는 거 같기는 한데 LinkedList를 순차척으로 도는 코드를 확인 못하겠습니다.감사합니다.
-
해결됨비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)
[숙제] minHeap 구현, maxHeap -> minHeap , minHeap -> maxHeap
minHeap 구현class MinHeap { // 최소힙 arr = []; #reheapUp(index) { if (index > 0) { const parentIndex = Math.floor((index - 1) / 2); if (this.arr[index] < this.arr[parentIndex]) { const tmp = this.arr[index]; this.arr[index] = this.arr[parentIndex]; this.arr[parentIndex] = tmp; this.#reheapUp(parentIndex); } } } insert(value) { const index = this.arr.length; this.arr[index] = value; // 마지막에 값을 넣어준다. this.#reheapUp(index); } #reHeapDown(index) { const leftIndex = index * 2 + 1; // 왼쪽 Index if (leftIndex < this.arr.length) { const rightIndex = index * 2 + 2; const smaller = this.arr[leftIndex] < this.arr[rightIndex] ? leftIndex : rightIndex; if (this.arr[index] > this.arr[smaller]) { const temp = this.arr[index]; this.arr[index] = this.arr[smaller]; this.arr[smaller] = temp; this.#reHeapDown(smaller); } } } remove() { // root만 remove if (this.arr.length === 0) { return false; } if (this.arr.length === 1) { // 마지막 하나 남으면 pop해서 리턴해주기 return this.arr.pop(); } const root = this.arr[0]; this.arr[0] = this.arr.pop(); this.#reHeapDown(0); return root; } sort() { // 힙 정렬 const sortedArray = []; while (this.arr.length > 0) { sortedArray.push(this.remove()); } return sortedArray; } search(value) { for (let i = 0; i < this.arr.length; i++) { if (this.arr[i] === value) { return i; } } return null; } // 특정값 수정 update(value, newValue) { const index = this.search(value); if (index === null) { return false; } this.arr[index] = newValue; for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { this.#heapify(i); } } // 특정값 삭제 removeValue(value) { const index = this.search(value); if (index === null) { return false; } // 특정값의 index를 splice를 이용하여 없애버린다. this.arr.splice(index, 1); for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { // 이렇게 했을때 힙이 깨질 수 있기 떄문에 heapify 해준다 this.#heapify(i); } } transFormMaxHeap() { for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { // i가 2부터 시작 // 이렇게 했을때 힙이 깨질 수 있기 떄문에 heapify 해준다 this.#maxHeapify(i); } return this.arr; } // 특정값을 수정하거나 특정값을 삭제하거나 #heapify(index) { const leftIndex = index * 2 + 1; // 왼쪽 Index 78의 왼쪽 5: 23 const rightIndex = index * 2 + 2; // 오른쪽 6: undefined const smaller = (this.arr[leftIndex] || Number.MAX_SAFE_INTEGER) < (this.arr[rightIndex] || Number.MAX_SAFE_INTEGER) ? leftIndex : rightIndex; if (this.arr[index] > this.arr[smaller]) { const temp = this.arr[index]; this.arr[index] = this.arr[smaller]; this.arr[smaller] = temp; this.#heapify(smaller); } } #maxHeapify(index) { const leftIndex = index * 2 + 1; // 왼쪽 Index const rightIndex = index * 2 + 2; const bigger = (this.arr[leftIndex] || 0) > (this.arr[rightIndex] || 0) ? leftIndex : rightIndex; if (this.arr[index] < this.arr[bigger]) { const temp = this.arr[index]; this.arr[index] = this.arr[bigger]; this.arr[bigger] = temp; // 재귀 호출 해주어야 된다! this.#maxHeapify(bigger); } } }최소 힙 insertconst minheap = new MinHeap(); minheap.insert(78); minheap.insert(56); minheap.insert(45); minheap.insert(32); minheap.insert(23); minheap.insert(19); minheap.insert(8); // 결과 [8, 32, 19, 78, 45, 56, 23]결과 그림최소힙 removeconst minheap = new MinHeap(); minheap.insert(78); minheap.insert(56); minheap.insert(45); minheap.insert(32); minheap.insert(23); minheap.insert(19); minheap.insert(8); minheap.remove(); minheap.remove(); minheap.remove(); minheap.remove(); minheap.remove(); minheap.remove(); // 8 , 32, 19, 78, 45 ,56, 23 // 19, 32, 23, 78, 45, 56 // 23, 32, 56, 78, 45 // 32, 45, 56, 78 // 45, 78, 56 // 56, 78 // 78최소힙 updateconst minheap = new MinHeap(); minheap.insert(78); minheap.insert(56); minheap.insert(45); minheap.insert(32); minheap.insert(23); minheap.insert(19); minheap.insert(8); minheap.update(32, 90); // [8, 32, 19, 78, 45, 56, 23] // 결과 -> [8, 45, 19, 78, 90, 56, 23]최소힙 removeValueconst minheap = new MinHeap(); minheap.insert(78); minheap.insert(56); minheap.insert(45); minheap.insert(32); minheap.insert(23); minheap.insert(19); minheap.insert(8); minheap.removeValue(19); // [8, 45, 19, 78, 90, 56, 23] // 결과 -> [8, 45, 23, 90, 56, 78]최소힙 -> 최대힙const minheap = new MinHeap(); minheap.insert(78); minheap.insert(56); minheap.insert(45); minheap.insert(32); minheap.insert(23); minheap.insert(19); minheap.insert(8); console.log(minheap.transFormMaxHeap()); // [ 8, 32, 19, 78, 45, 56, 23 ] // 결과 -> [78, 45, 56, 32, 8, 19, 23]최대힙 -> 최소힙class MaxHeap { arr = []; #reheapUp(index) { if (index > 0) { const parentIndex = Math.floor((index - 1) / 2); if (this.arr[index] > this.arr[parentIndex]) { // 값 바꾸기 const tmp = this.arr[index]; this.arr[index] = this.arr[parentIndex]; this.arr[parentIndex] = tmp; this.#reheapUp(parentIndex); } } } insert(value) { const index = this.arr.length; this.arr[index] = value; // 마지막에 값을 넣어준다. this.#reheapUp(index); } #reHeapDown(index) { const leftIndex = index * 2 + 1; // 왼쪽 Index if (leftIndex < this.arr.length) { // 만약에 왼쪽 인덱스가 총 배열의 길이보다 작은경우 const rightIndex = index * 2 + 2; const bigger = this.arr[leftIndex] > this.arr[rightIndex] ? leftIndex : rightIndex; if (this.arr[index] < this.arr[bigger]) { const temp = this.arr[index]; this.arr[index] = this.arr[bigger]; this.arr[bigger] = temp; this.#reHeapDown(bigger); } } } remove() { // root만 remove if (this.arr.length === 0) { return false; } if (this.arr.length === 1) { // 마지막 하나 남으면 pop해서 리턴해주기 return this.arr.pop(); } const root = this.arr[0]; this.arr[0] = this.arr.pop(); this.#reHeapDown(0); return root; } sort() { // 힙 정렬 const sortedArray = []; while (this.arr.length > 0) { sortedArray.push(this.remove()); } return sortedArray; } search(value) { for (let i = 0; i < this.arr.length; i++) { if (this.arr[i] === value) { return i; } } return null; } // 특정값 수정 update(value, newValue) { const index = this.search(value); if (index === null) { return false; } this.arr[index] = newValue; for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { this.#heapify(i); } } // 특정값 삭제 removeValue(value) { const index = this.search(value); if (index === null) { return false; } // 특정값의 index를 splice를 이용하여 없애버린다. this.arr.splice(index, 1); for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { // 이렇게 했을때 힙이 깨질 수 있기 떄문에 heapify 해준다 this.#heapify(i); } } transFromMinHeap() { for (let i = Math.floor(this.arr.length / 2 - 1); i >= 0; i--) { // i가 2부터 시작 // 이렇게 했을때 힙이 깨질 수 있기 떄문에 heapify 해준다 this.#minHeapify(i); } return this.arr; } // 특정값을 수정하거나 특정값을 삭제하거나 #heapify(index) { const leftIndex = index * 2 + 1; // 왼쪽 Index const rightIndex = index * 2 + 2; const bigger = (this.arr[leftIndex] || 0) > (this.arr[rightIndex] || 0) ? leftIndex : rightIndex; if (this.arr[index] < this.arr[bigger]) { const temp = this.arr[index]; this.arr[index] = this.arr[bigger]; this.arr[bigger] = temp; this.#heapify(bigger); } } // 특정값을 수정하거나 특정값을 삭제하거나 #minHeapify(index) { const leftIndex = index * 2 + 1; // 왼쪽 Index 78의 왼쪽 5: 23 const rightIndex = index * 2 + 2; // 오른쪽 6: undefined const smaller = (this.arr[leftIndex] || Number.MAX_SAFE_INTEGER) < (this.arr[rightIndex] || Number.MAX_SAFE_INTEGER) ? leftIndex : rightIndex; if (this.arr[index] > this.arr[smaller]) { const temp = this.arr[index]; this.arr[index] = this.arr[smaller]; this.arr[smaller] = temp; this.#minHeapify(smaller); } } } const heap = new MaxHeap(); heap.insert(8); heap.insert(19); heap.insert(23); heap.insert(32); heap.insert(45); heap.insert(56); heap.insert(78); console.log(heap.transFormMinHeap()); // [78, 32, 56, 8, 23, 19, 45] // -> 결과 [8, 23, 19, 32, 78, 56, 45] 질문1) maxheap(minheap) 코드 구현시 heapify 메서드에서 재귀호출 되어야 되지 않는가요?강의에서는 heapify 메서드 구현시 재귀 호출 부분이 빠져있는것 같아서 질문 드립니다. 아니라면 죄송합니다.#heapify(index) { const leftIndex = index * 2 + 1; // 왼쪽 Index const rightIndex = index * 2 + 2; const bigger = (this.arr[leftIndex] || 0) > (this.arr[rightIndex] || 0) ? leftIndex : rightIndex; if (this.arr[index] < this.arr[bigger]) { const temp = this.arr[index]; this.arr[index] = this.arr[bigger]; this.arr[bigger] = temp; // 여기 빠진것 같습니다! this.#heapify(bigger); } }