묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)
숙제1 LinkedList로 스택 구현하기
학습 목표- 배열 치트키 자료구조가 아닌 연결 리스를 이용하여 stack 자료구조를 구현하자.- 삽입과 삭제를 시간복잡도 O(1)가 되게 해야됨.- stack은 FILO이기 때문에 삭제시 마지막을 삭제해야됨. class Node { constructor(value) { this.value = value; this.next = null; this.prev = null; } } class LinkedList { constructor(length = 0) { this.length = length; this.head = null; this.tail = null; } add(value) { const newNode = new Node(value); if (this.head === null) { this.head = newNode; this.tail = newNode; } else { newNode.prev = this.tail; this.tail.next = newNode; this.tail = newNode; } this.length++; return this.length; } removeLast() { const value = this.tail.value; this.tail.prev.next = null; // 제일 마지막 이전의 next의 좌표를 null로 변경해줌 this.tail = this.tail.prev; // 마지막을 tail의 이전 노드로 변경 해줌 return value; } } // 숙제 1 연결리스트로 스택 만들기 class Stack { linkedList = new LinkedList(); add(value) { return this.linkedList.add(value); } pop() { return this.linkedList.removeLast(); } get top() { return this.linkedList.head.value; } get length() { return this.linkedList.length; } } const stack = new Stack(); console.log(stack.add(1)); // 1 console.log(stack.add(3)); // 2 console.log(stack.add(5)); // 3 console.log(stack.top); // 1 console.log(stack.length); // 3 console.log(stack.pop()); // 5결과디버거 결과를 확인 해보면 최종적으로tail의 value는 3이고 next는 null prev는 value1의 노드를 가르키고 있는걸 알 수 있다.
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이중 for로만 간단하게 풀어봤습니다. 괜찮을까요?
const solve = (arr) => { let count = 0; let u = 0; let r = 0; let d = 0; let l = 0; for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length; j++) { let my = arr[i][j] u = i !== 0 ? arr[i - 1][j] : 0 r = j !== arr.length - 1 ? arr[i][j + 1] : 0 d = i !== arr.length - 1 ? arr[i + 1][j] : 0 l = j !== 0 ? arr[i][j - 1] : 0 if (my > u && my > r && my > d && my > l) { count += 1 } } } return count }
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
LinkedList를 사용해서 풀어도 되나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.package sorting; import java.util.LinkedList; import java.util.Scanner; public class LRUMain { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int s = scanner.nextInt(); int n = scanner.nextInt(); LinkedList<Integer> cache = new LinkedList<>(); int[] tasks = new int[n]; for (int i = 0; i < n; i++) { tasks[i] = scanner.nextInt(); } for (int task : tasks) { if (cache.contains(task)) { cache.remove(cache.indexOf(task)); } cache.addFirst(task); if (cache.size() > s) { while (cache.size() > s) { cache.removeLast(); } } } for (int element : cache) { System.out.print(element+" "); } } }위 방식으로 접근해도 되나요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-I 재질문입니다..!!
안녕하세요 선생님 🙂 급한 마음에 질문하는 양식에 맞춰 질문하지 않았던 것 같습니다 죄송합니다 ㅠㅠ http://boj.kr/436a553bbbb24930908a3c7450ef7599 else if (result.size()) func();위의 코드는 str[i]가 숫자가 아니면서 result의 size가 1 이상일 경우라고 이해했습니다. 약간의 변형을 위하여 else if가 아닌 if문으로 변경하여 아래와 같이 변경했더니 결과 값이 이상해졌습니다.if (str[i] >= 97 && result.size()) func(); 이외에도 다방면으로 접근해봤지만 전부 결과 값이 이상하게 나왔습니다. 도대체 저 코드가 의미하는 것이 뭘까요..?? ㅠㅠ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
강사님 이렇게 풀어봤습니다.!
const solve = (arr) => { const result = [] for (let i = 0; i < arr.length; i++) { let count = 1 for(let j = 0; j < arr.length; j++) { if (arr[j] > arr[i]) { count += 1; } } result.push(count); } return result }조금 간단...해..보이게..?처음에 count 를 1로 줘서 1등으로 시작하고 풀이해주신 부분과 비슷하지만 살짝은,, 다르게 풀어봤습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-H 코드 한 번 봐주실 수 있으신가요?ㅎㅎ
안녕하세요 큰돌선생님! 늘 제가 먼저 해보고 선생님 코드를 보는데, 제 코드랑 달리 선생님 코드는 너무 깔끔해서 항상 감동합니다.. 늘 감사합니다다름이 아니라,http://boj.kr/3f2dfd5dd72a45e69326ea4b3d0e2216저는 이 문제에서 마지막 벽 하나 없애는 부분을 비트마스킹으로 경우의 수를 만들어서 싹 돌려줬는데요.. 5중 for문..ㅋㅋ으로 시간초과 뜰줄 알았으나 다행히(?) 맞았습니다가 뜨긴했는데 불안해서요.. 이런식으로 짜는 건 많이 비추하시나요?ㅠㅠ 실제 코테였다면 이렇게 하는게 위험한 방법인지 궁금해서 한 번 질문드려요!! 좋은 하루 보내세요!!
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-I 재질문있습니다
안녕하세요 선생님 🙂 다른 문제들을 풀다가 질문드렸던걸 까먹었었네요 ㅠㅠ 드렸던 질문은 해결되었지만 문제를 다시 들여다보니 이해가 가지 않는 부분이 하나 더 있어서 다시 질문드립니다. else if (result.size()) func();위의 코드는 str[i]가 숫자가 아니면서 result의 size가 1 이상일 경우라고 이해했습니다. 약간의 변형을 위하여 else if가 아닌 if문으로 변경하여 아래와 같이 변경했더니 결과 값이 이상해졌습니다.if (str[i] >= 97 && result.size()) func(); 이외에도 다방면으로 접근해봤지만 전부 결과 값이 이상하게 나왔습니다. 도대체 저 코드가 의미하는 것이 뭘까요..?? ㅠㅠ
-
해결됨김영한의 실전 자바 - 중급 2편
타입 매개변수 제한 강의 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.//문제 2: 개 타입 반환 //dogHospital.setAnimal(dog); Dog bigger = dogHospital.bigger(new Dog("멍멍이2", 400)); System.out.println(bigger);문제점 2번에서dogHospital.setAnimal(dog); 선언을 새로 한 이유가 있나요 ? 주석처리하고 컴파일해도 정상적으로 작동해서 여쭤봅니다.
-
해결됨김영한의 실전 자바 - 중급 2편
다른 타입의 데이터 나머지 연산 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]해시 인덱스를 ([데이터 값] % [배열 크기])로 지정하는 원리라는 것을 알게 되었습니다.데이터 값이 Integer라서 나머지 연산이 가능했는데,데이터가 다른 타입이면 나머지 연산을 어떻게 하나요?
-
해결됨김영한의 실전 자바 - 중급 2편
클래스 작성 시 줄바꿈 질문
강의에서 클래스를 작성하실 때,public class Marine extends BioUnit { // 줄바꿈 public Marine(String name, int hp) { super(name, hp); } }다음과 같이 한 줄 띄고 작성을 하시는데 그 이유가 있나요? 어떤 특별한 컨벤션 같은게 존재하는건지 아니면 편의상 이렇게 작성하시는건지 해당 줄바꿈의 의도가 궁금합니다.
-
미해결비전공자를 위한 자바
super 키워드
강사님 궁금한게 있습니다main( ) 메서드 에서 클래스를 만들고 부모 클래스에 있는 인스턴스를 . 을 이용해서 가져올때 부모와 자식 클래스에 이름이 같은 변수 를 가져올 때 main() 메서드 에서는 super 키워드 를 사용할수 있나요 ?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
120p unordered_map
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요교재 120p에 unordered_map은 정렬이 되지 않는다 라고 했는데 출력 값을 보면 우연인지(?) 입력의 역순으로 출력이 됬습니다ex) 입력 bcd - aaa - aba , 출력 aba-aaa-bcd왜 이런 순서로 출력이 됬는지 궁금합니다.출력도 입력과 마찬가지로 bcd - aaa - aba 로 나와야하는거 아닌가요? 감사합니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교재 116p map질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요.교재 115에 map은 "자동으로 오름차순으로 정렬되기 때문에 넣은 순서대로 map을 탐색할 수 있는 것이 아닌 아스키코드순으로 정렬된 값들을 기반으로 탐색한다"라고 되어있습니다.그러나 116p에 출력된 값에는kundol - 박종선 - 이승철 - 주홍철 순으로 출력이 됩니다. 그리고 (it).second를 출력했을 때 100 - 3 - 2 - 1 순인데 왜 이 순서인지 모르겠습니다.감사합니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
교재 76p 1.7 함수 파트 질문있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요.교재 76p 에서 2차원 배열 fill함수 코드dptj &b[9][10]가 이해가 잘 안됩니다.. (first,last]라서 1차원 배열에서 &a[10]처럼 한 것은 이해가 됬는데 2차원배열에서의 활용을 잘 모르겠습니다 +) 추가로왜 &b[10][10]가 아닌지,77p에서 배열 이름으로 초기화할 땐 왜 &b[0][0] + 10*10처럼 하는지 모르겠습니다. 추가 설명해주시면 감사하겠습니다.fill(&b[0][0],&b[9][10],2);
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-O 부연설명 강의에서 모듈러 연산이 이해가 잘 안됩니다
안녕하세요 큰돌님 강의 잘 듣고 있습니다!다름이 아니라 1-O 부연설명 강의에서 cnt = (cnt * 1) + 1과 cnt = (cnt % n * 10 % n) + 1이라고 말씀해주셨는데요!(1:02)그 다음에 설명해주실 때 (a * b + c) % n과 (a % n * b + c) % n과 동일하다고 설명해주시더라구요ㅠㅠ그래서 살짝 헷갈리는데결국에는 (a * b + c) % n = (a % n * b + c) % n = (a % n * b + c % n) % n이거인건가요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
Section 7-2) 휴가
안녕하세요, 강사님. 제 코드가 지저분하긴 하지만 (L, days라는 변수 두개 씀) 이 로직도 맞는 걸까요? 테스트 돌려보면 예시들은 success로 나오긴 합니다. 근데 확신이 안 서서요.. 참고로 저는 t, p 리스트를 인덱스 0부터 시작했습니다. import sys sys.stdin=open("input.txt", "r") def DFS(L, days, income): global answer if L>n: return if days>n: return if days==n: if answer<income: answer=income else: DFS(L+1, days+t[days], income+p[days]) DFS(L+1, days+1, income) n=int(input()) t=list() p=list() for _ in range(n): tt,pp=map(int,input().split()) t.append(tt) p.append(pp) answer=-214700000 DFS(0,0,0) print(answer)
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
Section 7-1) 최대점수 구하기(DFS)
안녕하세요 강사님, 질 좋은 강의 제공해주셔서 감사합니다. 아래 첨부한 제 코드로 진행하면 DFS(L+1, sum+s[L], time+t[L]) 에서 list list index out of range 에러가 뜹니다. 강사님은 아래와 같이 푸셨던데, 제 코드에서 어떠한 점이 에러를 반환했을까요?if L==n: if sum>answer: answer=sum import sys sys.stdin=open("input.txt","r") def DFS(L, sum, time): global answer if time>m: return if L==n and sum>answer: answer=sum else: DFS(L+1, sum+s[L], time+t[L]) DFS(L+1, sum, time) n,m=map(int, input().split()) s=list() t=list() for i in range(n): ss,tt=map(int,input().split()) s.append(ss) t.append(tt) answer=0 DFS(0,0,0) print(answer)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-M while문으로 풀어보았습니다
http://boj.kr/d6ab60409324405daf25b4576458619a답안의 for(;; i++) 구문이 눈에 잘 들어오지않아서..무한루프라면 while문 으로도 할수 있을지 않을까 해서 구현해 보았습니다..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요.
안녕하세요. 오늘부터 큰돌님 강의를 듣게된 수강생입니다.코딩테스트 공부를 이번엔 잘 준비하고싶은데 여기저기 방황하다가, 큰돌님 강의를 수강하게되었습니다. 큰돌님 강의를 온라인이아닌, 오프라인으로 혹시 들을 수 있는 곳이 있을까요 ?온라인으로만 강의를 하시는지 여쭤보려고 글 남깁니다!감사합니다 :)
-
해결됨비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)
연결 리스트 구현 숙제 리뷰 부탁드려봅니다
// 숙제1 next가 아닌 이전것 prev를 구하기 // 숙제2 삽입이 시간복잡도가 O(n)인데 O(1)으로 변경하기 (hint tail) class Node { constructor(value) { this.value = value; this.next = null; this.prev = null; } } class LinkedList { constructor(length = 0) { this.length = length; this.head = null; this.tail = null; } add(value) { const newNode = new Node(value); if (this.head === null) { this.head = newNode; this.tail = newNode; } else { /* 수정 const [prev] = this.#search(this.length - 1); this.tail.prev = prev; this.tail.next = newNode; newNode.prev = this.tail; this.tail = newNode; */ newNode.prev = this.tail; this.tail.next = newNode; this.tail = newNode; } this.length++; return this.length; } search(index) { return this.#search(index)[1]?.value; } prevSearch(index) { return this.#search(index)[0]?.value; } currentAndPrevNode(index) { return this.#search(index); } #search(index) { let count = 0; let prev; let current = this.head; while (count < index) { prev = current; current = current?.next; count++; } return [prev, current]; } remove(index) { const [prev, current] = this.#search(index); if (prev && current) { if (!current.next) { // 마지막 노드 삭제일경우! prev.next = null; // 마지막 노드 삭제일때 이전 노드의 next를 null로 만들어주면 끝 this.tail = prev; // 마지막 노드를 삭제 했기 때문에 tail을 이전 노드로 바꾸어주어야 한다. } else { // 중간 삭제 일때 prev.next = current.next; current.next.prev = prev; // 현재 노드의 next노드의 이전 노드 prev를 prev 노드로 변경 } this.length--; return this.length; } else if (current) { // index 0일 때 this.head = current.next; this.length--; return this.length; } else { // 삭제하고자 하는 대상이 없을 떄 // 아무것도 안함 } } } const linkList = new LinkedList(); linkList.add(1); // 삭제 linkList.add(2); linkList.add(3); linkList.add(4); linkList.add(5); // 삭제 linkList.add(6); linkList.add(7); linkList.add(8); // 삭제 console.log(linkList.search(6)); // 7 console.log(linkList.prevSearch(2)); // 2 console.log(linkList.tail.prev.value); // 마지막 꼬리의 이전이니까 7 console.log(linkList.remove(0)); // 첫번째 삭제 7 console.log(linkList.prevSearch(2)); // 3 console.log(linkList.tail.prev.value); // 마지막 꼬리의 이전이니까 7 console.log(linkList.remove(6)); // 마지막 삭제 6 console.log(linkList.tail.prev.value); // 삭제후 꼬리 이전이니까 6 console.log(linkList.tail.next); // null console.log(linkList.remove(3)); // 5 const [prev, cur] = linkList.currentAndPrevNode(3); // 첫번째 튜플은 이전노드 두번째 튜플은 현재 노드 console.log(prev.value); // 4 console.log(prev.next.value); // 6 console.log(cur.value); // 6 console.log(cur.prev.value); // 4::) prev와 tail을 추가 하였고 add 메서드와 remove 메서드를 수정 하였습니다.질문1) 연결리스트 구현 숙제에 해당하는 정답 코드인지 리뷰 부탁드려도 될까요?질문2) tail만 사용 했을때는 O(1) 시간복잡도를 가지게 add 메서드를 구현했었는데 prev가 추가되면서 const [prev] = this.#search(this.length - 1); 로직을 추가하여 prev를 구해서 O(1)가 아니게 된것 같은데 무언가 더 좋은 방법이 있을것 같습니다! (저는 고민 해봤는데 모르겠습니다)