묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
토마토 시간초과 질문입니다
선생님 풀이 보기 전에 두가지 방법으로 풀었는데 두 방법모두 4, 5번 input에 대해 시간초과가 나옵니다 대량 3~4초씩 걸립니다 ㅠㅠ두가지 방법 하나는 선생님 풀이와 사소한 부분을 제외하면 같은 방식이고, 다른 하나는 pair를 사용해서 level을 올리는 방식으로 했습니다. 두번째 방식 코드 올려봅니다.왜 시간초과가 생기는 것일까요..?ㅠㅠ#include<iostream> using namespace std; #include<vector> #include<algorithm> #include<queue> struct Pos { bool operator==(const Pos& other) { return y == other.y && x == other.x; } bool operator!=(const Pos& other) { return !(*this == other); } Pos operator+(const Pos& other) { Pos tmp = *this; tmp.y = tmp.y + other.y; tmp.x = tmp.x + other.x; return tmp; } int y; int x; }; Pos front[4] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1}, }; int main(void) { cin.tie(NULL); ios_base::sync_with_stdio(false); freopen("in5.txt", "rt", stdin); // 파일 입력받음 int n, m; // n은 상자 세로, m은 상자 가로 cin >> m >> n; vector<vector<int>> box(n, vector<int>(m)); queue<pair<Pos, int>> q; for (int y = 0; y < n; y++) { for (int x = 0; x < m; x++) { cin >> box[y][x]; if (box[y][x] == 1) { q.push(make_pair(Pos{ y, x }, 0)); } } } int now_lv; while (q.empty() == false) { pair<Pos, int> tmp = q.front(); q.pop(); Pos now = tmp.first; now_lv = tmp.second; for (int dir = 0; dir < 4; dir++) { Pos next = now + front[dir]; if (next.y<0 || next.y>n - 1 || next.x<0 || next.x>m - 1) continue; if (box[next.y][next.x] == -1 || box[next.y][next.x] == 1) continue; box[next.y][next.x] = 1; q.push(make_pair(next, now_lv + 1)); } } for (int y = 0; y < n; y++) { for (int x = 0; x < m; x++) { if (box[y][x] == 0) { cout << "-1"; return 0; } } } cout << now_lv; }
-
해결됨자바 코딩테스트 - it 대기업 유제
sorting & thinking 7번 최소 회의실 개수
안녕하세요 강사님 자바 알고리즘 입문 강좌에 이어 이번 강좌 까지 들으며 많은 도움을 받고 있는 수강생입니다. 우선 양질의 강의를 제공해주신 것에 감사드립니다.이번 문제에서 저는 아래와 같이 코드를 작성했습니다. 자료구조 파트 마지막 문제와 유사하다고 생각했서 아래와 같이 풀었습니다. 저는 해법 영상에서와 같은 논리라고 생각하는데 혹시 논리적 오류가 있을까요? public int solution(int[][] meetings) { int answer = 0; PriorityQueue<Meeting> pq = new PriorityQueue<>(); Arrays.sort(meetings, (a, b) -> a[0] - b[0]); for (int[] meeting : meetings) { if (pq.isEmpty()) { pq.add(new Meeting(meeting[1], answer)); answer++; } else { if (pq.peek().end <= meeting[0]) { pq.add(new Meeting(meeting[1], pq.poll().room)); } else { pq.add(new Meeting(meeting[1], answer)); answer++; } } } return answer; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
17406 변수명이 겹쳤을 때 질문
안녕하세요 강사님http://boj.kr/5dfc0dabb69045c6980f9ea7c7af0072해당 코드에서 53번째 줄 Board b와 61번째 줄 int bb가 통과 전에는 둘 다 b로 선언해서 맞왜틀로 시간을 좀 썼는데요.. 코드 제출 전에 제가 디버깅할 때는 답도 잘 출력되고 따로 에러도 안 떠서 아무 문제가 없는줄 알았는데 제출할 때만 틀렸습니다가 뜨는 이유가 무엇일까요?
-
해결됨코딩테스트 [ ALL IN ONE ]
교재는 어디서 받을 수 있나요?
수강생 추가 혜택! 교재 제공(출판 전까지만)그 notion 초대 구글폼 제출했는데 거기에 적은 이메일로 보내주시나요!?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이런식으로 p1 p2를 안써도 괜찮을까요 ?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.바로 shift()로 빼주었는데 이래도 괜찮은걸까요 ? const input = `3 1 3 5 5 2 3 6 7 9`.split("\n"); let arr1 = input[1].split(" ").map((str) => Number(str)); let arr2 = input[3].split(" ").map((str) => Number(str)); function solution(arr1, arr2) { let answer = []; while (arr1.length && arr2.length) { if (arr1[0] < arr2[0]) { answer.push(arr1.shift()); } else { answer.push(arr2.shift()); } } while (arr1.length) { answer.push(arr1.shift()); } while (arr2.length) { answer.push(arr2.shift()); } return answer; } console.log(solution(arr1, arr2));
-
해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
결혼식 문제 Queue로 풀어봤습니다.
import java.util.*; class Marry implements Comparable<Marry>{ public int s; public int e; public Marry(int s, int e){ this.s = s; this.e = e; } @Override public int compareTo(Marry o){ if(this.s == o.s) return this.e - o.e; else return this.s - o.s; } } public class 결혼식 { public int solution(Marry[] slot, int n){ int answer = 1; PriorityQueue<Integer> Q = new PriorityQueue<>(); Q.offer(slot[0].e); for(int i = 1; i < n; i++){ while(Q.peek() <= slot[i].s) { Q.poll(); } Q.offer(slot[i].e); answer = Math.max(answer, Q.size()); } return answer; } public static void main(String[] args) { 결혼식 T = new 결혼식(); Scanner in = new Scanner(System.in); int n = in.nextInt(); // ArrayList<Marry> arr = new ArrayList<>(); Marry[] slots = new Marry[n]; for(int i = 0; i < n; i++){ int s = in.nextInt(); int e = in.nextInt(); slots[i] = new Marry(s, e); } Arrays.sort(slots); System.out.println(T.solution(slots, n)); } } 도착 시간이 현재 인덱스의 시작 시간보다 작거나 같을 때 해당하는 Q를 poll() 해주는 방식으로 처리했습니다.사실 저는 PriorityQueue가 아니라 그냥 Queue로 풀었는데, 둘이 결과가 상이합니다.PriorityQueue로 풀었을 때는 정답 값이 나오는데그냥 Queue로 풀었을 때는 틀린 값이 나옵니다.PriorityQueue는 우선순위 값을 먼저 반환한다는 차이가 있다는데,Queue를 사용해도 시작 시간 s 값이 같을 경우 e를 오름차순으로 설정해줬기 때문에 e가 작은 값부터 출력이 되어서 정답 값이 나와야 한다고 생각하는데 아니네요.. 계속 짱구를 굴려보는데 이유를 모르겠습니다...긴글이지만 강사님 도와주십쇼!+ 추가 ) Queue로는 해결이 안되었던 이유를 이제야 알 것 같습니다.. 피로연에 도착한 시간 s 값이 0일 때 나가는 시간 e가 76이라고 가정해보고, 다른 하객은 s 값이 75이고, 나가는 시간 e가 76일 때 Queue로 구현하여 FIFO 방식으로 처리하게 되면도착 시간 s 를 오름차순으로 정렬하기 때문에 0 10 1...0 76과 같이 Q에 저장될 것이고s = 76이 되었을 때s = 0 , e = 76인 값만 데이터가 삭제되고,s = 75, e = 76인 값은 데이터가 삭제되지 않는 문제가 발생하게 됩니다. 하지만 PriorityQueue로 구현하게 되면 e 값이 76인 모든 데이터를 삭제할 수 있게 되므로 이러한 문제를 해결할 수 있게 됩니다.혹시 맞나요..?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 확인 부탁드립니다.
function solution(m, product) { let answer = 0; let n = product.length; let cnt = 0; product.sort((a, b) => a[0] / 2 + a[1] - (b[0] / 2 + b[1])); // console.log(product); for (let i = 0; i < n; i++) { m = m - (product[i][0] / 2 + product[i][1]); cnt++; //console.log("cnt", cnt); if (product[i][0] + product[i][1] > m) break; answer = cnt; } return answer; } //콘솔에서는 cnt가 4로 나왔는데 답에서 3으로 출력이 됩니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
12100번 구조체를 사용하지 않는 코드가 가능할까요?
안녕하세요 강사님~해당 문제를 처음 풀 때 애초에 구조체를 사용할 생각을 떠올리지 못 해서 구조체 없이 강사님 코드의 rotate90 메서드와 move메서드 아이디어만 활용해서 코드를 작성해보려고 했는데 막혔습니다 ㅜ제가 생각한 접근법은 완탐으로 5번을 이동시킬 수 있는 모든 경우의 수를 체크해보려했습니다. 근데 기존 완탐 문제들과는 다르게 단순 visited = 0;하는 원복 패턴이 아니라 원복은 불가능해보이고, 원복없이 배열을 90도 회전 -> move(이동하기)까지 마치고 복사 배열을 다음 재귀함수에 넘겨주려고 했는데 그럼 move 메서드에서 배열을 변환 후 복사 배열을 리턴해줘야 되지 않나요? array는 리턴이 되는건지 검색해봐도 처음보는 코드들만 난무해서..강사님 코드는 애초에 구조체 내부 각 메서드 마지막에 memcpy를 사용하여 변환된 a 배열을 잘 보존시키는데 구조체 방식이 아니라면 이 문제를 해결할 방법이 없을까요?이렇게 아예 접근조차 못 하는 문제들은 그냥 강사님 코드보며 외우고 넘어가야하는지 이러면 실력이 느는 것인지 고민되네요 ㅜ마지막으로 해당 강의에서 move함수가 ⬆️(윗방향)으로 블록이동한다고 설명하시는데 코드는 ⬅️ 방향으로 블록이동인 것 같은데 제가 이해한 게 맞을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
재귀함수를 통한 순열 구현이 잘 이해가 가지 않습니다
순열을을 도식화 했을때swap(0, 0) swap(1 , 0) , swap(2 , 0)하고 다음과정에 permutation함수가 재귀 호출 되는데요제가 이해하기론permutation(3 , 3 , 1)permuatation(3, 3, 2)permutation(3 , 3, 3) 이 맞는거 같은데 왜permutation(3 , 3 , 1)permuatation(3, 3, 1)permutation(3 , 3, 1)이렇게 되는지 이해가 되지 않습니다 ㅠㅠ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이 풀이도 괜찮을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 콘솔창엔 답이 나오긴 하는데 반례가 있나 싶습니다..! const input = `5 28 6 6 2 2 4 3 4 5 10 3`.split("\n"); function solution(input) { let totalMoney = Number(input.shift().split(" ")[1]); let inputNumArr = input .map((arr, index) => { if (index === input.length - 1) { return [Number(arr.split(" ")[0]) / 2, Number(arr.split(" ")[1])]; } else { return [Number(arr.split(" ")[0]), Number(arr.split(" ")[1])]; } }) .sort((a, b) => a[0] - b[0]); let count = 0; for (let i = 0; i < inputNumArr.length; i++) { let presentSum = inputNumArr[i].reduce((a, b) => a + b, 0); if (totalMoney - presentSum < 0) { break; } else { totalMoney -= presentSum; count++; } } return count; } console.log(solution(input));
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[5-B] 메모리 초과
split를 활용했는데 47%까지 가다 메모리 초과가 발생하는데 혹시 이유가 뭔지 궁금합니다 ㅠㅠ어느 부분이 공간 복잡도를 많이 잡나요?? 재귀적으로 함수를 호출해서 그런가요?? #include <bits/stdc++.h> using namespace std; string S, bS; vector<string> split(string input, string delimiter){ vector<string> ret; long long pos = 0; string token = ""; while ((pos = input.find(delimiter))!=string::npos) { token = input.substr(0, pos); ret.push_back(token); input.erase(0, pos+delimiter.length()); } ret.push_back(input); return ret; } void go(string inputs){ if(inputs==""){cout << "FRULA"; return;} vector<string> new_str_v = split(inputs, bS); if(!new_str_v.empty()){ if(new_str_v[0] == inputs){ cout << inputs; return; }else{ string new_str = ""; for(auto i : new_str_v) new_str+=i; new_str_v.clear(); go(new_str); } } return; } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> S >> bS; go(S); }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-H 질문합니다.
안녕하세요. 선생님강의 항상 잘 보고 있습니다.http://boj.kr/748c1be340784788af3183283cd97163배열로 prev 하신 부분을 강의 듣기전에 map으로 풀었는데 왜 틀렸는지 잘 모르겠습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-H 질문
안녕하세요 강사님 모범답안에서 몇가지 질문드립니다1. if(isVowel(idx)){ lcnt++, vcnt = 0, is_include_v = 1; }else{ vcnt++, lcnt = 0; }여기서 카운트하는 변수를 서로 바꿔도 상관 없는거죠? 밑의 코드처럼요!if(isVowel(idx)){ vcnt++, lcnt = 0, is_include_v = 1; }else{ lcnt++, vcnt = 0; }2. 위에서 int prev = -1; 선언했고 밑에 if문에서 if(i >= 1 && (prev == idx) && (idx != 'e' && idx != 'o'))이렇게 prev를 사용하셨는데요 두 코드 사이에 prev값이 증가하는 코드가 따로 없는거같은데 -1이었던 prev가 어떻게 idx값이랑 같을수가있나요? 이전값prev와 현재값idx가 같으면 동일한 문자 2개가 연속되는것이다 라는 의도는 알겠는데 어떻게 같을수가있는지 (prev == idx) 이 코드 이해가 안됩니다ㅠ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 교안을 어떻게 공부해야하는지 질문드립니다.
안녕하세요. 대학교 알고리즘 대회 준비중인 고3입니다.강의에 제공하는 교안을 다운받아서 5월 초부터 지금까지 64쪽까지 하기는 했습니다 그런데앞쪽에 나오는 개념들이 아직 배우지 않았는 뒤쪽에 그 개념 설명이 있는 경우에는 제가 어떻게 공부해야 해야하는지 모르겠습니다.예를 들어 64쪽에 이터레이터 예제코드에는 push_back()이 있고 이거는 88쪽에 개념이 설명되어있습니다.또 42쪽의 split에는 백터 개념이 사용되는데 이거는 그 앞에서 배우지 않았던 거라서 이게 뭐지? 하게 되구요..이런식으로 뒤쪽에 개념 설명이 있는 것들이 앞쪽에 코드예제에 사용될 때가 있는데 이럴때는 이떻게 공부해야할까요?? 혹시나 제가 잘못 공부하고 있는게 아닌지 걱정됩니다. ㅜㅜ8월달이 대회이고, 저는 php를 조금 했고 이 강의를 처음 시작할땐 c++은 거의 몰랐었습니다.아, 그리고 글을 읽어보니 부트캠프 코딩테스트는 5주차 정도면 쉽게 하실 수 있을거라는 댓글을 보았는데 혹사 대학교 알고리즘 대회도 동일할까요? 국민대 알고리즘 대회를 준비하고 있습니다.감사합니다!!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
좌표를 2차원 배열로 나타낼때
cin >> m >> n >> k;저는 이런식으로 큰돌님과 거꾸로 해서 풀었는데요. fill(&a[0][0], &a[100][101], 1); for (int i = 0; i < k; i++) { cin >> sx >> sy; cin >> ex >> ey; ey -= 1; ex -= 1; a[sy][sx] = 0; //2,0 a[ey][ex] = 0;// 3,3 for (int j = sy; j <= ey; j++) { for (int p = sx; p <= ex; p++) { a[j][p] = 0; } } 아래 큰돌님 소스가 더 간단한 것 같아서 이해를 하려고 하는데 머리에서 쥐가나네요.. for(int i = 0; i < k; i++){ cin >> x1 >> y1 >> x2 >> y2; for(int x = x1; x < x2; x++){ for(int y = y1; y < y2; y++){ a[y][x] = 1; } } 0대신 1로 표기하는 것은 이해햇으나, 이중포문의 순서나 a[][] 에서 x,y가 어느순서로 들어가는지 사고과정을 좀 알려주시면 감사하겠습니다. } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
atoi를 이용한 코드가 틀린 이유
http://boj.kr/216b077f0cbc47fabca1436ebcabad2b선생님 이 문제를 atoi를 이용해서 풀 면 틀렸다고 뜨는데 그 이유가 atoi함수 자체가 string을 int로 바꾸는거라 string의 길이 제한을 넘어가기 때문에 틀렸다고 뜨는 건가요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-F 문제 이해가 되질 않습니다.
예제 입력 1에 왜 출력이 6이 나오는지 이해가 되질 않습니다.1 -> 3 -> 3 -> 5 순으로 사과를 받게 되면 최소 거리가 4라고 생각합니다.
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
교육과정설계 문제 관련 질문입니다.
import sys sys.stdin = open("input.txt", "rt") a = input() order = [] n = int(input()) course = '' for TC in range(1, n+1): course = input() for x in a: order.append(x) for x in course: if x in order and x == order[0]: order.pop(0) elif x in order and x != order[0]: print("#%d NO" % TC) order.clear() break else: if len(order) != 0: order.clear() print("#%d NO" % TC) else: print("#%d YES" % TC)문제를 풀이할 때 큐를 사용하지 않고 리스트만 사용해서 작성한 코드입니다.리스트에서도 pop(0)으로 큐에서의 popleft()기능 수행이 가능하고 append도 동일하게 사용 가능한데 큐를 사용하는 이유가 궁금합니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-F 맞왜틀 질문
http://boj.kr/21f627bbbf1542a3b18476f88f391725안녕하세요 강사님 어디가 틀린건지 도저히 모르겠습니다간단한 코드라서 틀릴만한 건덕지가 아마..바구니 위치 초기값을 강사님과 다르게 왼 오 각각 지정해줬고, 바구니가 이동될때마다 이동하는 칸만큼 왼 오 각각에다가 더하거나 빼준 부분밖에 없어보이는데, 이거 이렇게 해도 논리 맞는거 아닌가요..?ㅜㅜ
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
문제 그대로 배열 가져올 경우 질문입니다.
안녕하세요 선생님, 강의 재밌게 듣고 있습니다.질문입니다.문제에서 [5,28](학생수,예산) 배열도 그대로 가져오면 코드가 어떻게 수정될까요? (처음 let arr에 추가 할 경우 말씀드립니다)i 와 j for문 돌때 1부터 시작하면 된다고 생각했는데, 답이 안나와서 질문드립니다!! function sol(m,arr){ let ans = 0; let n = arr.length; arr.sort((a,b)=>((a[0]+a[1])-(b[0]+b[1]))); for(let i = 1; i < n; i++){ let money = m - (arr[i][0]/2 + arr[i][1]); let cnt = 1; for(let j = 1; j < n; j++){ if(j !== i && arr[j][0]+arr[j][1] > money) break; if(j !== i && arr[j][0]+arr[j][1] <= money){ money -= (arr[j][0]+arr[j][1]); cnt++; } } ans = Math.max(ans, cnt) } return ans;}let arr= [[5,28],[6,6],[2,2],[4,3],[4,5],[10,3]];console.log(sol(28,arr));