function isSame(map1, map2) { if (map1.size !== map2.size) return false; for (const [key, val] of map2) { if (!map1.has(key) || map1.get(key) !== val) return false; } return true; } function solution(s, t) { let answer = 0; const map1 = new Map(); const map2 = new Map(); const n = t.length; const ss = s.slice(0, n); for (const s of t) { if (map1.has(s)) { map1.set(s, map1.get(s) + 1); } else { map1.set(s, 1); } } for (const s of ss) { if (map2.has(s)) { map2.set(s, map2.get(s) + 1); } else { map2.set(s, 1); } } if (isSame(map1, map2)) answer++; for (let i = n; i < s.length; i++) { map2.delete(s[i - n]); map2.set(s[i], map2.get(s[i]) ? map2.get(s[i]) - 1 : 1); if (isSame(map1, map2)) answer++; } return answer; } const s = "bacaAacba"; const t = "abc"; console.log(solution(s, t)); 슬라이딩 윈도우로 처음 t만큼 잘라서 비교한 이후 부터 돌면서 처리 했는데 다른 문제가 있을까요...?
안녕하세요 수업 강의를 보다가, 풀어주신 방법이 저와 다르고 for 문 하나만으로 해결이 가능하지 않나 싶어서 확인차 질문 드려봅니다. pdf 상의 정답은 모두 맞춘 상태입니다. 간단하게 하라도 피드백 주신다면 감사합니다 class Solution5 { public static int solution(int[] nums){ // answer : 정답 // len : 현재 수열 길이 // d : 현재 수열의 방향 ( 0: 증가, 1: 감소) // prevNum : 이전 숫자 int answer = 0, len = 0, d = 0, prevNum = Integer.MIN_VALUE; for (int num : nums) { if (d == 0) { // 1. 현재 수열이 증가하고 있는 상황 // 2. 수열이 증가하고 있는 상황에서의 시뮬레이션 if (prevNum > num) { // 이전 숫자보다 작을 경우, 수열의 방향을 감소로 변경 d = -1; } else if (prevNum == num) { // 이전 숫자와 값이 같을 경우, 바이토닉 수열이 아니므로 길이 초기화 len = 0; } // 길이 증가 len++; } else { // 1. 현재 수열이 감소하고 있는 상황 // 2. 수열이 감소하고 있는 상황에서의 시뮬레이션 if (prevNum > num) { // 2-1. 이전 숫자보다 작을 경우, 길이 증가 len++; } else { // 2-2. 이전 숫자보다 크거나, 같을 경우 수열이 끝났다고 판단 // 2-2-1. 현재까지의 길이를 계산하여 더 길면 정답으로 변경 if (answer < len) { answer = len; } // 2-2-2. 초기화 len = 1; // 현재 숫자부터 다시 시작하므로 값은 1 d = 0; // 2-2-3. 현재 숫자 이전의 값을 비교했을 때, 증가하고 있었다면 길이 하나 증가 if (prevNum < num) { len++; } } } prevNum = num; } // 현재 진행중이던 수열이 감소하고 있고 길이가 정답보다 크다면, 정답으로 변경 if (answer < len && d == -1) { answer = len; } return answer; } public static void main(String[] args){ Solution5 T = new Solution5(); System.out.println(Solution5.solution(new int[]{1, 2, 1, 2, 3, 2, 1})); System.out.println(Solution5.solution(new int[]{1, 1, 2, 3, 5, 7, 4, 3, 1, 2})); System.out.println(Solution5.solution(new int[]{3, 2, 1, 3, 2, 4, 6, 7, 3, 1})); System.out.println(Solution5.solution(new int[]{1, 3, 1, 2, 1, 5, 3, 2, 1, 1})); } }
http://boj.kr/0aeaba2d60a745ba87e41316d0804d89 위 코드를 디버깅 해보면 v.clear()를 실행 시킨 후 dfs함수로 들어가서 v.push_back()을 하면 오류가 발생합니다. 오류:"Unhandled exception thrown: read access violation. _Pnext was 0x8." 왜 이런 오류가 발생하는지 궁금합니다. 해결방안도 알고 싶습니다.
안녕하세요, 선생님 ! 2792번 선생님 코드에 질문이 있어 질문 남깁니다. check()에서 return n>=num이 약간 이해가 안됩니다. 처음 저는 n>num이라고 생각했었습니다. n=num이 될 떄의 값이 최적해 겠구나 생각했었습니다. 아니면 혹은 n>num일 떄도 정답이 될 수 있어서 그런 것 일까요?!?
안녕하세요 🙂 큰돌님 교안 108p에 있는 예제코드를 제가 insert와 erase를 이해하기 위해서 아래와 같이 변경하였는데요. #include <bits/stdc++.h> using namespace std; list<int> a; void print(list<int> a) { for (auto it : a) cout << it << " "; cout << '\n'; } int main() { for (int i = 1; i <= 3; i++) a.push_back(i); // a = 1 2 3 for (int i = 1; i <= 3; i++) a.push_front(i); // a = 3 2 1 1 2 3 auto it = a.begin(); it++; a.insert(it, 1000); // 3 1000 2 1 1 2 3 a.insert(it, 2000); // 3 1000 2000 2 1 1 2 3 print(a); it = a.begin(); it++; cout << "*it : " << *it << '\n'; a.erase(it); print(a); cout << "*it : " << *it << '\n'; a.pop_front(); a.pop_back(); print(a); cout << a.front() << " : " << a.back() << '\n'; a.clear(); return 0; } 다음과 같이 변경해서 출력하면, 3 1000 2000 2 1 1 2 3 *it : 1000 3 2000 2 1 1 2 3 *it : 2 2000 2 1 1 2 2000 : 2 이렇게 나오는데, insert와 erase 메서드 모두 매개변수로 전달받은 iterator에다가 각각의 기능을 실행한 뒤 그 다음 위치(그 다음 인덱스)를 가리키도록 바꿔주는 걸까요? 제 예상으로는 출력의 두 번째 *it 이 2000으로 나올 것으로 예상했는데, 2가 나와서 a.erase(it); 를 했을 때, it이 인덱스 1을 가리켜서 1000을 지우고 난 뒤, 그 다음 인덱스인 2를 가리키게 돼서 2를 가리키게 된 것으로 이해하였는데 맞을까요?? 마찬가지로 위의 insert도 인덱스 1 위치에서 삽입을 한 뒤, it은 인덱스 2를 가리키게 되고, 또 insert 해서 마지막엔 it이 인덱스 3을 가리키는 로직으로 이해하였습니다! 혹시 이러한 로직이 맞다면, list만 이런 것인지 다른 자료구조의 insert도 이런지 궁금합니다! 감사합니다.
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public int solution(int n, int m, int arr[]) { int answer = 0; int sum = 0; int lt = 0; int rt = 1; // 초기 합 설정 sum += arr[lt] + arr[rt]; while (rt < n - 1) { if (sum < m) { sum += arr[++rt]; } else if (sum == m) { answer++; sum -= arr[lt++]; } else { sum -= arr[lt++]; } } // while문에서 rt가 마지막 인덱스일 때 합은 검증을 못해서 검증 로직 추가 if (sum == m) answer++; return answer; } public static void main(String[] args) { Main T = new Main(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int arr[] = new int[n]; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.println(T.solution(n, m, arr)); } } 이 코드가 효율적인 코드인지 궁금해서 질문드립니다!!
function solution(n, arr) { // 소수를 판별하는 함수 function isPrime(num) { if (num === 1) return false; if (num === 2) return true; for (let i = 2; i <= Math.sqrt(num); i++) { if (num % i === 0) return false; } return true; } const answer = arr.filter((num) => { let reverseNum = Number(String(num).split('').reverse().join('')); if (isPrime(reverseNum)) { console.log(reverseNum); return reverseNum; } }); return answer; } const n = 9; const arr = [32, 55, 62, 20, 250, 370, 200, 30, 100]; console.log(solution(n, arr)); filter 내의 조건문에서 isPrime 함수에서 판별하고 true인 것을 콘솔에 출력해보면 23, 2, 73, 2, 3 이렇게 나오는데 밑에 return reverseNum;을 하고 나서 answer을 보면 [ 32, 20, 370, 200, 30 ] 이렇게 출력되는데 왜 숫자가 다르게 나오는 건가요?
사소한 차이같은데 해석이 "서버에서"보다는 "서버에" 또는 "서버로부터"가 맞지 않나 생각이 듭니다. 여러가지 상황이 있겠지만 해석부분만 봤을때 떠오르는 첫번째 상황은 API 호출이 뭔가 모바일 기기나 브라우져가 아니라 서버에서 API 콜이 일어나는 상황처럼 생각되어지는...? 혹시 제가 착각한거일까요?
We are building a program that utilizes the latest tech stacks. 이 문장에 대한 해석으로 "우리는 최신 기술 스택을 활용해 프로그램을 빌드하고 있습니다."라고 되어있는데, "우리는 최신 기술 스택을 활용하는 프로그램을 빌드하고있습니다."가 올바른 해석 아닌가요? a program that utilizes 니까 프로그램이 최신 기술 스택을 활용하고 있는걸로 봐야하는게 아닌지요...?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <bits/stdc++.h> using namespace std; struct Point { int y, x; }; bool cmp(const Point &a, const Point &b) { return a.x > b.x; } vector<Point> v; int main() { for (int i = 10; i >= 1; i--) { v.push_back({i, 10 - i}); } sort(v.begin(), v.end(), cmp); for (auto it : v) cout << it.y << " : " << it.x << "\n"; return 0; /* 1:9 2:8 3:7 4:6 5:5 6:4 7:3 8:2 9:1 10 : 0 */ } 질문드립니다 해당 vector는 Point를 기반으로 만들어진 벡터임을 알겠는데 v.begin()은 이터레이터를 반환하잖아요?? (주소값 반환) *v.begin()로 주소안의 값을 확인하려했는데 되지 않아 아마 struct 변수가 2개라 무엇을 기준삼지 않아 오류가 나는거같은데 혹시 값 반환하는 방법이 있을까요? 제가 이해한 내용이 틀렸다면 어떤식으로 이해해야하나요??
안녕하세요, 강의 너무 잘 듣고 있습니다. 5강 최적화 강의의 3번 상담이라는 문제를 푸는데, 제공해주신 답변과 제가 작성한 코드에 차이가 있어 질문드립니다. [모범답안] def recur(idx, result): global answer if idx > n: if idx > n+1: return answer = max(answer, result) return recur(idx + table[idx][0], result + table[idx][1]) recur(idx + 1, result) n = int(input()) table = [[] for _ in range(n+1)] for i in range(n): a, b = map(int, input().split()) table[i+1] = [a, b] # print(table) answer = 0 recur(1, 0) print(answer) [제가 작성한 코드] # 14501 import sys sys.stdin = open('/Desktop/dev/BackJoon/5강_최적화/3_상담.txt','r') input = sys.stdin.readline N = int(input()) arr = [list(map(int, input().split())) for _ in range(N)] def recur(idx, price): global ans if idx >= N: # 배열의 마지막 인덱스를 지나가는 것은 무시 return if idx == N-1: # 배열의 마지막 인덱스 ans = max(ans, price) return recur(idx+arr[idx][0], price+arr[idx][1]) recur(idx+1, price) ans = 0 recur(0,0) print(ans) 모범답안과 종료조건이 다른 것을 확인했습니다. 제가 생각했을 때, 배열의 마지막 인덱스 (N-1)에서도 하루 짜리 일을 할 수도 있기 때문에 recur를 한번 더 돌수 있고 그 다음 인덱스 N 시점에서 종료되어야 한다고 생각해서 코드를 작성했습니다. 혹시 제가 잘못 생각하고 있는 부분이 있을까요? 또한, 제공해주신 답변은 table을 N+1의 길이로 생성 recur(1,0)로 시작 하고 있는데 해당 문제는 꼭 이렇게 접근해야 되는 것인가요? 미리 감사드립니다.
m2 맥북에어 사용자인데 cd /Library/Developer/CommandLineTools/usr/include 로 해서 들어가는 거까진 했는데 여기서 mkdir bits를 하니 permission denied 가 떠서 접근권한 문제인거 같은데 어떤거를 변경해야 할 지 몰라서 질문합니다.
채점사이트에서 출력은 "첫 줄에 가장 가까운 두 말의 최대 거리를 출력하세요." 라고 되어 있었습니다. 제 생각대로라면 말들이 여러마리니까 가장 가까운 말들의 거리가 말들마다 다를수도 있겠다는 생각이 들어. 최대거리를 구하기 위해 코드를 조금 다르게 쳤습니다. 채점사이트에서는 정답처리 되었는데 확신이 안들어서 이 방식대로 풀어도 되는지 피드백주세요. 또한, 제가 한 방식과 원래 풀이가 어떤 차이가 있는지 궁금합니다. 첨부 1. 원래 풀이, 내가 생각한 풀이 2. 문제 전체 소스코드 *강의 풀이 방식 count() public int count(int[]arr, int distance){ int ep=0, cnt=1; for(int i=1; i<arr.length; i++){ //배치가능 if(arr[i]-arr[ep] >= distance){ cnt++; ep=i; } } return cnt; } *내가 푼 방식 count() public int[] count(int[]arr, int distance){ int [] res = new int[2]; int ep=0, cnt=1; int min = Integer.MAX_VALUE; for(int i=1; i<arr.length; i++){ //배치가능 if(arr[i]-arr[ep] >= distance){ cnt++; min = Math.min(min,arr[i]-arr[ep]); // 말들의 최소거리 ep=i; } } res[0] = cnt; // distance로 배치되는 말의 수 res[1] = min; // 말들의 최소 거리 return res; } *강의 풀이 방식 solution()내부 이진탐색 while문 while (lt<=rt){ int mid = (lt+rt) / 2; //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다. if(count(arr,mid) >= m){ // mid : 말들의 최소거리 lt = mid+1; answer = mid; } else rt = mid-1; } *내가 푼 solution()내부 이진탐색 while문 while (lt<=rt){ int mid = (lt+rt) / 2; int res[] = count(arr,mid); //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다. if(res[0] >= m){ // mid : 말들의 최소거리 lt = mid+1; answer = res[1]; // answer = mid 가 아닌 count메소드에서 계산한 말들의 최소거리를 넣어준다. //(말들이 여러마리일때 가장 가까운말의 최대거리를 구하라고 문제에 명시되어있어서) } else rt = mid-1; } 전체 소스코드 import java.util.*; public class Main { public int[] count(int[]arr, int distance){ int [] res = new int[2]; int ep=0, cnt=1; int min = Integer.MAX_VALUE; for(int i=1; i<arr.length; i++){ //배치가능 if(arr[i]-arr[ep] >= distance){ cnt++; min = Math.min(min,arr[i]-arr[ep]); // 말들의 최소거리 ep=i; } } res[0] = cnt; // distance로 배치되는 말의 수 res[1] = min; // 말들의 최소 거리 return res; } public int solution(int n ,int m, int[] arr){ int answer = 0; Arrays.sort(arr); int lt = 1; int rt = arr[n-1]-arr[0]; //arr[arr.length-1]로 끝내도 큰 차이 없음 while (lt<=rt){ int mid = (lt+rt) / 2; int res[] = count(arr,mid); //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다. if(res[0] >= m){ // mid : 말들의 최소거리 lt = mid+1; answer = res[1]; // answer = mid 가 아닌 count메소드에서 계산한 말들의 최소거리를 넣어준다. //(말들이 여러마리일때 가장 가까운말의 최대거리를 구하라고 문제에 명시되어있어서) } else rt = mid-1; } return answer; } public static void main(String[] args) { Main M = new Main(); Scanner kb = new Scanner(System.in); int n = kb.nextInt(); int m = kb.nextInt(); int [] arr = new int [n]; for(int i=0;i<n;i++)arr[i]= kb.nextInt(); System.out.print(M.solution(n,m,arr)); } }