http://boj.kr/c987a498c5014855a47dd70a1ca8da7f 안녕하세요 큰돌님 ! 해당 문제 DP로 접근했는데 강의 초반에 말씀해주신 것처럼 메모리 초과로 실패했습니다. 여쭤보고 싶은 것이 강의에서 'DP로 풀면 상태값 저장하기가 힘들다'라는 말씀해주셨는데 혹시 이 말뜻이 구체적으로 무엇을 뜻하는건가요? 저는 '결과들을 DP 배열 또는 다른 자료구조로 쌓아나가기 힘들다'라고 해석해서 처음 dp 배열을 map<pair<int,int>, int> 맵으로도 바꿔보고 sum과 idx를 1000곱하고 더해 하나의 longlong으로도 시도해봤는데요. 좀 더 생각해보니 상태값을 저장하다가 메모리 초과가 발생한 것이 아니라 재귀 스택이 너무 많이 쌓여서 메모리 초과가 발생한 것이 좀 더 meet in the middle 알고리즘을 사용하는 이유에 적합한 것 같은데 맞을까요?
강시님께서 풀어주신 TreeSet 변수 이름: set 제가 풀었던(오답처리가 난) TreeSet 변수 이름: ex 강사님께서 풀어주신 for문의 형태입니다. 제가 처음에 풀 때 for 문의 형태입니다. indexOutOfBoundsException이 발생하거라고 생각하여 위와 같이 조건문을 실행하였습니다. (indexOutOfBoundsException이 발생할것이라는 것은 잘못 생각한 부분입니다.) 처음에 계속 오답이 나서 조건문을 강사님과 같이 수정하니 정답처리가 되었습니다. 하지만 제가 풀었던 for문의 조건문은 사실상 강사님께서 풀어준것과 똑같은 결과를 도출할 것이라 예상하였고, 실제로 set과 ex를 equals 메서드를 이용해보면 true를 반환합니다. 왜 for문의 조건문을 제가 푼 방식대로 설정하면 객체는 true를 반환하지만(같은 객체라고 판단된다고 생각됩니다.) 정답은 오답처리가 되는걸까요?
import java.util.Scanner; public class Main { public static void main(String[] args) { //입력 Scanner scn = new Scanner(System.in); int n = scn.nextInt(); int m = scn.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = scn.nextInt(); } int count = 0; int sum = 0; int i = 0; int k = 1; // 더한 수열 인자의 갯수 while(i<n){ sum += arr[i]; if(sum<m) { i++; k++; } else if(sum>m){ while(sum>m){ sum -= arr[i-(k-1)]; // m 보다 크면 맨앞에거 창문에서 제거 k--; if(sum==m) count++; i++; k++; // 맨앞을빼줘서 count증가하고 index증가할때 그 다음이 바로 sum>m 경우면 또 k--를 빼주기때문에 여기서 k++를 해줘야한다. if(sum<m) i++; } } else if(sum==m){ count++; i++; } } System.out.println(count); } } 문제 예제와 다른 커뮤니티 질문에 답변에 있던 예제 5 3 1 1 1 1 1 경우도 통과했는데 오답이 나옵니다 ㅠㅠ 저는 lt, rt 같은 위치자(?)를 사용하지 않고 sum 되고 있는 배열 인덱스의 갯수를 세서 sum > m 경우 맨 앞인덱스를 제외시킬때 사용하였습니다.
function solution(arr) { let answer = 0; let max = arr[0]; for (let i = 0; i <= arr.length; i++) { if (max < arr[i + 1]) answer++; max = arr[i + 1]; } return answer; }
너비우선 탐색부분 강의 듣는중입니다! 이전 강의에서 암시적 그래프 최단거리 찾기 등의 그래프를 구현할 때는 [1,1,0,1,1] 이런식으로 구현하라고 하셨는데, 저런 문제도 지금 bfs강의에서 외우라고 하신 템플릿 대로 외워서 조금 응용해서 풀면 되는건가요??? 격자판 문제가 조금 어려워서 질문드립니다! 격자판은 템플릿이 따로 있나..해서요!
안녕하세요. 선생님 ㅎㅎ 수업 잘 듣고 있습니다. 수업에서 알려주신 visited 배열의 값들을 증가시키면서 depth를 세는 방법 말고, 구조체를 정의해서 문제를 풀어봤는데요? 이게 어떤 방법은 틀리고 어떤 방법은 맞아서.. 어디서 차이가 나는지 궁금해서 질문드립니다. <맞은 코드> http://boj.kr/646d439f862e419ab3a865fdd7b1551b 일단 큐에 현재 노드에서 갈 수 있는 노드(4방향)를 모두 넣고, 이후에 조건으로 노드를 선별하고, 혹시나 해서 아래와 같은 탈출 조건을 추가했습니다. if (row == m - 1 && col == n - 1) { res = depth; break; } <틀린 코드> http://boj.kr/516fe108a71c492e8c1967455f7222a1 이번에는 큐에 넣기 전 예상되는 노드를 조건문을 통해서 선별하고 큐에 넣습니다. 제 생각에는 이 코드가 큐에 들어가는 노드의 개수가 적어서 속도가 빠를 것 같은데, 메모리 초과가 나오더라구요;; <수정 코드> http://boj.kr/f72b373b45464778b8313fec9713ba18 수정을 해봤는데 이번에는 틀린 코드랑 나머지는 똑같은데 반복문 안에서 큐에 넣자마자 바로 방문처리를 해주는 것입니다. for (int i = 0; i < 4; i++) { int nr = row + dr[i]; int nc = col + dc[i]; if (nr < 0 || nr >= m || nc < 0 || nc >= n) { continue; } if (puzzle[nc][nr] == 0) { continue; } if (visited[nc][nr]) { continue; } q.push({nr, nc, depth + 1}); visited[nc][nr] = true; } 이렇게 수정하니까 또 맞더라구요.. <수정 코드>가 <틀린 코드>보다 메모리를 덜 차지하는 것은 알겠는데, <맞은 코드>가 <틀린 코드>보다 메모리를 덜 차지하는 잘 모르겠어서 질문드립니다. 질문이 길어서 sorry...
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Main main = new Main(); for (int i = 0; i < n; i++) { System.out.print(main.solution(i) + " "); } } private int solution(int i) { if (i <= 1) { return 1; } return solution(i - 1) + solution(i - 2); } }
import java.util.*; class Main { public String solution(String need, String plan){ String answer = "YES"; Queue<Character> q = new LinkedList<>(); for(char x: need.toCharArray()){ q.offer(x); // 필수과목을 q에 넣어줌 } for(int i = 0; i<plan.length(); i++){ if(!q.isEmpty() && q.peek() == plan.charAt(i)){ //교육과정 첫 번째 과목 == 현수의과목 q.poll(); } } if(!q.isEmpty()){ answer ="NO"; } return answer; } public static void main(String[] args){ Main T = new Main(); Scanner kb = new Scanner(System.in); String a=kb.next(); String b=kb.next(); System.out.println(T.solution(a, b)); } } 안녕하세요! 항상 양질의 강의 잘 듣고 있습니다! 처음에 if(!q.isEmpty() && q.peek() == plan.charAt(i)) 부분에서 if(q.peek() == plan.charAt(i)) 로 조건문을 짰는데, 런타임 에러가 나서 !q.isEmpty() 를 붙였더니 정상적으로 잘 돌아가게 되었습니다. 웹서핑을 하다보니 큐에 자료가 없을 경우 q.peek()를 할 경우 exception이 나 런타임 에러가 난다고 하는 데 맞을까요?
http://boj.kr/116102baf98342ddbbb0c1926c191911 안녕하세요. 문제 보고 코드를 작성하였고, 실행 시켰을때 결과도 문제에서 요구하는대로 잘 출력되는데 백준에서 채점 결과는 왜 틀렸다고 뜨는지 잘 모르겠습니다. 혹시 코드에서 잘못된 부분이 있는지 한번 봐주실 수 있나요? 감사합니다.
선생님 안녕하세요 좋은 강의를 만들어주신 덕분에 잘 보고 있습니다. 조합으로 점화식을 도출해내신 것을 보고 궁금한 점이 생겨서 가르쳐주시면 감사하겠습니다. 강의 12분 540초에서 5C3 = 4C2+4C3 점화식을 도출해내신 것을 보고 제가 제대로 이해했는지 확인하기 위해 다른 시도를 해봤습니다. 위의 점화식은 5개의 데이터 중 4개를 이미 선택이 완료된 데이터로 가정했을 때 도출이 되는 식입니다. 그래서 저는 5개의 데이터 중 3개를 이미 선택이 완료된 데이터로 가정했을 때로 점화식을 도출해봤습니다. 그래서 D[5][3] = D[3][3] + (D[3][2] * 2) +D[3][1] 라고 도출해봤는데, 혹시 제가 제대로 이해했는지 봐주시면 감사하겠습니다.
안녕하세요, 큰돌님! 이번 문제를 풀 때, 저는 출력을 cout.precision(4) cout << ret; 이렇게 cout.precision()을 사용해서 제출을 했더니 틀렸다고 나오고 printf("%0.3lf", ret); printf를 사용했을 때는 정답이라고 나와서 질문드립니다. 입력을 cin으로 받았기 때문에 cout으로 출력을 하고 싶었는데 두개의 차이가 무엇인지 궁금합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 왜 moves 탐색시 for...of가 아니라 forEach를 쓰시는건가요?? for...of도 사용할 수 있지 않나요?
안녕하세요 큰돌님 https://www.acmicpc.net/submit/5430/62168272 위 코드가 시간 초과가 납니다. 다른 질문글을 봤을때, 문자열을 split에서 최악의 경우 시간 복잡도가 n^2가 된다고 하였는데 어떤 경우에서 시간 복잡도가 n^2이 되는지 궁금합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution() { let answer; let calStack = []; for(let i of cal) { if(isNaN(i)) { let num1 = calStack.pop(); let num2 = calStack.pop(); let val = 0; switch(i) { case '+': val = num1 + num2; break; case '-': val = num2 - num1; break; case '*': val = num1 * num2; break; case '/': val = num2 / num1; break; } calStack.push(val); } else calStack.push(Number(i)); // i는 문자이기 때문에 숫자로 바꾸어 stack에 push 해야함 } answer = calStack[0]; return answer; } let cal = "352+*9-"; console.log(solution()); switch 문을 이용해서 문제를 풀었는데 괜찮은 코드인가요? 효율성면에서 if문이 switch문보다 좋은지도 궁금합니다.