묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-J 질문드립니다.
안녕하세요 큰돌님! 3-J번 Queue를 두번사용하지 않고 풀어봤는데요.단순히 0일경우 visited를 카운트 안하고1일경우에만 카운트하여 풀이를 해봤습니다. 예제는 전부 맞는데 제출하니 틀렸다고 나옵니다.어떤 부분을 놓친걸까요?또 어떤 반례가 있을까요? http://boj.kr/b6ecc8c40aa24dee8f2c8dc46e5b2486
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-J질문입니다!
의상 종류가 몇 개인지 알기 위해서 b를 _map[b]++;를 해주셨는데, int형인 cnt[]배열말고 자료구조 map을 쓴 이유가 들어가는 요소인 b가 string형이라서 map을 쓴건가요?for(char a : s) cnt[a - 'a']++; 가 가능한 이유는 요소가 문자일지라도 요소가 char형이기 때문인것이 맞나요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-J 문제 컴파일이 안돼요
안녕하세요 1-J 9375번 문제를 푸는데 계속 컴파일이 안돼요.devc++ 사용하고 있는데요, 강사님 코드로 컴파일 해도 오류가 나요. 뭐가 문제일까요?http://boj.kr/b8ffa79b7bbc43a7b291d205f9015698for(auto c : _map) 이 부분에서 [Error] 'c' does not name a type 이런 오류가 떠요.
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이렇게 풀어도 괜찮을까요?
혹시 반례가 있을까요???function solution(N, K) { let queue = []; for(let i = 1; i <= N; i++){ queue.push(i); } // k를 체크하기 위해 idx 변수를 사용한다. let idx = 1; while(queue.length > 1){ if(idx !== K){ queue.push(queue[0]); idx++; }else idx = 1; queue.shift(); } return queue[0]; }
-
미해결코테 출제자가 알려주는 [코딩 테스트 with 파이썬]
통찰력
1강부터 드는 질문이 있습니다 강사님.혹시 첫번째 문제를 보고 해당 문제가 이분탐색과 관련된 문제구나라는 걸 어떻게 아는지, 아니면 다른 문제들도 마찬가지로 어떤 문제는 어떤 방법이 적절하다라고 판단을 하는지 혹시 노하우가 있으신지 여쭤봅니다.
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
8.수열 추측하기
이 문제에서 N이 만약 5일 경우, 더한 결과값이 값에 각각 4C0 4C1 4C2 4C3 4C4 를 곱해서 더한것과 같다고 하셨는데 왜 그런지 이유를 모르겠습니다..!!ㅜㅜ
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 3-G 질문 있습니다!
안녕하세요 큰돌님.매번 좋은 강의 잘 듣고 있습니다. 수빈이의 좌표가 100,000으로 주어졌을 경우 *2 한 200,000까지 처리할 수 있도록 코드를 작성했다고 생각하는데,계속해서 메모리 초과로 실패합니다..혹시 제가 미쳐 신경쓰지 못한 부분이 있다면 지적해주시면 감사하겠습니다. http://boj.kr/094b02dd883548a88d9ca6d3fa2261cb
-
미해결자바 코딩테스트 - it 대기업 유제
공부 방법 질문 있습니다.
안녕하세요 선생님. 먼저 이번에도 좋은 강의 감사드립니다.제 공부방법에 대해 질문드리고 싶은데요, 저의 경우는 일단 고민을 해서 제 코드로 문제를 해결한 후에,선생님의 해설 강의를 듣고 보안할 부분이 있다면 코드를 수정하여 , 다시 리뷰하면서 코드를 작성하는 편으로 복습을 하고 있습니다.그런데 가끔 , 제 방식과 선생님의 방식이 전혀 다른 경우가 있습니다. 예를들면 이번 문제가 그러했는데요,이렇게 풀이 방식이 다른 경우에도, 일단 선생님이 설명해주신 방식대로 생각하고 , 코드를 작성하는 것이 사고의 폭을 넓이는 방식이겠죠? (제가 정답을 알고있는것 같은데,, 질문 드려서 죄송합니다.)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2주차 visited배열 타입관련 질문
안녕하세요 선생님 항상 질좋고 열정넘치는 강의를 만들어 주셔서 감사합니다 다름이 아니라 2주차 visited[]을 선언할 때 bool타입과 int형 두가지 타입을 쓰시는데 어떤 기준으로 두 가지 타입을 나눠 써야 하나요??
-
해결됨Do it! 알고리즘 코딩테스트 with JAVA
시간복잡도 강의 질문
시간복잡도 강의에서 n이 100만일 때를 가정해서 설명해주셨고, 상수는 무시한다라는 걸 확인했습니다. 만약, 0부터 n까지 도는 for문 하나가 100만개 있다고 가정하면, 이것 또한 상수를 무시해서 Big-O 표기법으로 O(N)이 되나요? 아니면 N * N이 되므로 O(N^2)이 되나요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드리뷰 부탁드립니다
function solution(s, arr){ let answer = 0; let delivery = [] let prods = [] let max = arr[0][0] for(let i=0; i<arr.length;i++){ prods.push(arr[i][0]) delivery.push(arr[i][arr[i].length-1]) for(let j=0; j<arr[i].length;j++){ if(max <= arr[i][j]){ max = arr[i][j] } } } const res = prods.map((x,idx)=>{ if(x== max){ x = x/2 } return x+delivery[idx] } ).sort((a,b)=> a-b) res.reduce((acc,cur)=>{ if(acc<= s){ answer ++ } return acc+cur },res[0]) return answer } let arr=[[6, 6], [2, 2], [4, 3], [4, 5], [10, 3]]; solution(28, arr)할인을 위 코드 처럼 가장 가격이 큰 상품에 다가 적용했는데 이런 경우 예외 케이스가 발생할까요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
두 코드의 차이
강사님 안녕하세요!코드를 보다가 궁금한 점이 있어 질문드립니다.저는 아래와 같이 최소 값을 따로 배열로 걸러내서 Math.min을 사용해서 구했습니다.강사님 방식과 비교해보니 저는 배열을 하나 더 썼고 Math.min을 사용했기 때문에 제 코드가 조금 더 비효율적으로 보이는데, 저와 비슷하게 코드를 짠 분의 답글에 괜찮은 코드라고 하시더라구요!두 코드 사이의 속도나 효율성면에서는 큰 차이가 없는 것인가요? function solution(arr){ let answer = []; let sum = 0, min = 0; arr.forEach((num) => { if (num % 2 !== 0) { sum += num; // 합산하기 answer.push(num); // 홀수 걸러내기 } }) min = Math.min(...answer); answer = [sum, min]; return answer; }
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
9_6 친구인가(서로소문제)
안녕하세요 교수님, 질문이있어서 글 남깁니다.교수님과 살짝 다른풀이로 풀었는데, 채점하는 사이트에서 계속 첫번째 케이스에서 runtime error가 나서요ㅠㅠ다른 테스트케이스들은 잘돌아가는데 첫번째만 안돌아갑니다ㅜㅜ자바 이클립스에서도 문제없이 예제테스트케이스 (첫번째 테스트케이스) 돌아갑니다.... // 서로소 집합 (유니온파인드) import java.util.*; class Main { static int n,m=0; //n:학생수, m:순서쌍개수static int[] parent; public static int find(int x) {if(x==parent[x]) return x;elsereturn parent[x]=find(parent[x]); //최상위 부모 누구인지 } public static void main(String[] args) {Main tree=new Main();Scanner scanner=new Scanner(System.in);n=scanner.nextInt();m=scanner.nextInt();parent=new int[n+1]; //배열 초기화 해야됨 - 자기자신이 부모가 되도록 초기화for(int i=1; i<=n; i++) {parent[i]=i;} //입력받아서 배열만들기for(int i=1; i<=m; i++) {int par=scanner.nextInt();int son=scanner.nextInt();parent[son]=par;} int a=scanner.nextInt();int b=scanner.nextInt(); if( (tree.find(a)) != (tree.find(b)) ){ System.out.print("NO"); } else System.out.print("YES"); } }
-
해결됨코딩테스트 [ ALL IN ONE ]
완전 탐색
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.완전탐색부터는 강의가 없는데 해당 강의는 업데이트가 되는건가요? 아니면 추가로 결제를 해야할까요??
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G 예외처리 질문입니다.
안녕하세요 선생님! 강의 항상 잘 보고 있습니다. 저는 이 문제 예외처리를 합해서 생각한 게 아니라 나눠서 비교해도 될 것 같아서 그렇게 로직을 짰는데, 실패했고 '내 코드보기'를 하면 Error를 뱉고 있더라고요 혹시 어떤 문제일까요?강의 보고 합한 걸로 처리하니까 통과 됐고, 합해서 하는 게 더 좋은 거라는 생각은 했는데, 나눠서 생각한 게 왜 틀린지를 잘 모르겠습니다. 33~36 line 입니다. 링크 첨부합니다~https://www.acmicpc.net/source/57441252
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K 관련 질문 드립니다!
안녕하세요 큰돌님! 다름이 아니라 1-K를 이런 식으로 풀어봤습니다. 하지만 자꾸 틀리는데 반례를 못찾겠어서 질문 드려봅니다. <코드 설명>저 같은 경우 map을 이용해 <한 문자, 문자 개수>를 만들어 개수가 홀수인 문자가 2개 이상이면 "I' m sorry Hansoo"를 출력하며 종료하고 그 외에는 팰린드롬을 만듭니다. 팰린드롬은 다시 문자의 개수가 홀수인 문자가 존재하는 경우와 아닌 경우로 나뉘는데, 존재하는 경우 tmp에 잠시 저장해놓고 나머지는 ret에 철자순으로 저장합니다그리고 tmp를 ret에 붙인 다음에 substr로 해당 문자열을 복사한 뒤 temp에 저장합니다. 마지막으로 temp를 reverse로 역순배치를 하여 ret에 이어붙입니다.최종적으로 이를 출력하는 로직입니다.(문자의 개수가 모두 짝수인 경우는 tmp를 ret에 붙이는 과정만 없고 나머진 동일합니다)정말 열심히 생각해서 풀었는데 왜 틀렸는지 조차 몰라서 매우 속상합니다...반례나 틀린 부분이 어디인지 알려주신다면 정말 정말 감사하겠습니다...! #include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); map<char, int> mp; string word, ret; bool isOdd = false; int cnt = 0; char tmp; cin >> word; for(int i = 0; i < word.size(); i++) { mp[word[i]]++; } for(auto it : mp) { if((it).second % 2 == 1) { cnt++; if(cnt > 1) { cout << "I'm Sorry Hansoo"; break; } tmp = (it).first; isOdd = true; for(int i = 0; i < (it).second / 2; i++){ ret += (it).first; } } else { for(int i = 0; i < (it).second / 2; i++){ ret += (it).first; } } } string word2 = ret; if(isOdd) { word2 += tmp; string temp = ret.substr(0, temp.size() - 1); reverse(temp.begin(), temp.end()); word2 += temp; } else { string temp = ret.substr(0, temp.size()); reverse(temp.begin(), temp.end()); word2 += temp; } if(cnt < 2) cout << word2; return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 교안 33p 질문
알고리즘 교안 33pa.find("love") 부분에 대한 이해가 맞는지 질문드립니다.it = a.find("love") 에서 it 값이 love가 있다라고 결정되면it != string::npos -> string::npos(string이 없다)와 값이 같지 않아서 있다고 인정된다맞을까요? C언어에 대한 기초 강의를 듣고 시작해도 조금 버겁네요ㅜㅜ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-B 시간 복잡도..!
#include <bits/stdc++.h> using namespace std; int N, M, res; int vis[54][54]; char bd[54][54]; string s; vector<pair<int,int>> land; vector<int> select_land; int dy[4] = {0, -1, 0, 1}; int dx[4] = {1, 0, -1, 0}; void bfs(){ pair<int,int> st = land[select_land[0]]; // land pair<int, int> ed = land[select_land[1]]; // land queue<pair<int,int>> Q; Q.push({st.first, st.second}); // Q삽입 vis[st.first][st.second] = 1; // 방문표시 while(!Q.empty()){ pair<int, int> cur = Q.front(); Q.pop(); for(int dir = 0 ; dir < 4 ; dir++){ int ny = cur.first + dy[dir]; int nx = cur.second + dx[dir]; if(ny==ed.first && nx==ed.second) { vis[ny][nx] = vis[cur.first][cur.second] + 1; res = max(res, vis[ny][nx]); return; // 도착하면 종료 } if(ny >= N || nx >= M || ny < 0 || nx < 0) continue; if(bd[ny][nx]=='W' || vis[ny][nx]!=0) continue; // 방문했거나 물이면 pass Q.push({ny, nx}); vis[ny][nx] = vis[cur.first][cur.second] + 1; } } // 도착하지 못했다면, 그냥 for문을 빠져나옴. (res 업데이트 필요 X) } void solve(int n){ if(select_land.size()==2){ // 2개를 고름. bfs(); fill(&vis[0][0], &vis[0][0] + 54*54, 0); // vis배열 초기화 return; } for(int i = n+1 ; i < land.size() ; i++){ // 땅 전체 개수 (0번부터 land.size()-1번까지) select_land.push_back(i); // 01, 02, 03 ..... solve(i); select_land.pop_back(); } return; } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> M; for(int i = 0 ; i < N ; i++){ cin >> s; for(int j = 0 ; j < M ; j++){ bd[i][j] = s[j]; if(s[j]=='L') land.push_back({i,j}); } } // 입력 받기 solve(-1); cout << res-1; }저는 랜드를 모두 구해서 랜드 중에 2개를 뽑고, 최단거리를 구하고 최단거리중 최대값을 뽑는 로직으로 구해봤습니다. 그런데 시간복잡도에서 계속 걸리네요 ㅠㅠ 혹시 크기가 50*50이라 재귀적으로 하려했는데 이 코드는 시간복잡도가 어떻게 되나요 ㅠㅠ
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
DFS, BFS 풀이 차이점
import java.util.*; import java.io.*; /* 다음과 같이 여러 단위의 동전들이 주어져 있을때 거스름돈을 가장 적은 수의 동전으로 교환해주려면 어떻게 주면 되는가? 각 단위의 동전은 무한정 쓸 수 있다. 입력 : 첫 번째 줄에는 동전의 종류개수 N(1<=N<=12)이 주어진다. 두 번째 줄에는 N개의 동전의 종류가 주어지고, 그 다음줄에 거슬러 줄 금액 M(1<=M<=500)이 주어진다.각 동전의 종류는 100원을 넘지 않는다. 출력 : 첫 번째 줄에 거슬러 줄 동전의 최소개수를 출력한다. ex. 3 1 2 5 15 -> 3 ( 출력 설명 : 5 5 5 동전 3개로 거슬러 줄 수 있다. ) */ public class P05_동전교환 { static int N, total, answer; static Integer[] coins; public static void main(String[] args) throws Exception { // 초기 세팅 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Integer.parseInt(br.readLine()); coins = new Integer[N]; StringTokenizer st = new StringTokenizer(br.readLine()); for (int i=0; i<N; i++) { coins[i] = Integer.parseInt(st.nextToken()); } total = Integer.parseInt(br.readLine()); // 로직 Arrays.sort(coins, Collections.reverseOrder()); // coins 내림차순 정렬 (int[] 배열이 아닌 Integer[] 배열이여야 함 !!) // 방법1. BFS // BFS(); // 방법2. DFS answer = total; DFS(0, 0); // 출력 System.out.println(answer); } public static void BFS() { Queue<Integer> q = new LinkedList<>(); for (int i=0; i<N; i++) { q.offer(coins[i]); } int count = 1; while (true) { int size = q.size(); for (int i=0; i<size; i++) { int tmp = q.poll(); for (int j=0; j<N; j++) { int next = tmp + coins[j]; if (next == total) { answer = count + 1; return; } q.offer(next); } } count++; } } public static void DFS(int count, int sum) { if (sum > total || count >= answer) { return; } if (sum == total) { answer = Math.min(answer, count); } else { for (int i=0; i<N; i++) { DFS(count+1, sum+coins[i]); } } } } 처음에 혼자 풀 때 BFS 문제인 것 같아 BFS로 풀었고, 강의보고 나서 다시 DFS로 풀어봤는데DFS와 BFS 풀이 방법 중 어느 것이 더 좋은 방법인가요 ?성능면에서 DFS와 BFS 중 어떤 것이 더 좋은지 궁금합니다 .. !
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
hit가 발생한 후부터만 뒤로 하나씩 미는 방법
function solution(size, arr) { const cache = new Array(size).fill(0); let hit; for (let i = 0; i < arr.length; i++) { hit = false; for (let j = cache.length - 1; j >= 0; j--) { if (hit) { cache[j + 1] = cache[j]; } if (cache[j] === arr[i]) { hit = true; } } if (!hit) { cache.unshift(arr[i]); cache.pop(); } else cache[0] = arr[i]; } return cache; }바깥 for문 처음에 캐시 배열에 찾는 값이 있는지 확인하는 반복문을 한번 돌지 않고, 한번만 반복문을 돌면서 hit가 발생한 이후부터만 뒤로 한칸씩 미는 방법으로 코드를 짜봤습니다.이렇게 작성해도 괜찮을까요? 반례 있을까요?