묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-J 질문있습니다 :)
안녕하세요 선생님 🙂 이 문제를 처음봤을 때 DP방식도 떠오르긴 했지만 1개씩만 사용하는 문제다보니 그리디 방식도 떠오르더라구요. 하지만 이 문제는 K라는 무게 제한이 있다보니 그리디가 조금 빡셀 수도 있겠다 싶더라구요. 질문은 아래와 같습니다. 그리디로 설계할 수 있는 문제인지설계할 수 있다면 간단하게 가능한지, 빡센 문제인지 즐거운 명절 보내세요 ^^
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
for문 초기값 설정 방식에 대한 시간 초과 질문 있습니다.
for문의 i값의 설정 방식만 다르게 했을 뿐인데 시간 초과가 나는 점이 이해가 가지 않아 질문 드립니다.A 코드 (시간 초과가 나지 않는 코드)int solution(int n) { int answer = 0; int t = 1; while(t <= n) { int test = 0; for(int i=t; i<=n; i++){ test += i; if(test == n) { answer++; break; } if(test > n){ break; } } t++; } return answer; }B 코드 (시간 초과가 발생하는 코드)int solution(int n) { int answer = 0; int t = 0; while(t <= n) { int test = 0; for(int i=t+1; i<=n; i++){ test += i; if(test == n) { answer++; break; } if(test > n){ break; } } t++; } return answer; }해당 코드들은 프로그래머스 숫자의 표현에 대한 코드 입니다.강의와 관련없는 문제에 대해 질문 드리는 점 정말 죄송합니다.하지만 아무리 원인을 파악하려해도 파악되지 않아 부득이하게 질문 드립니다.해당 코딩 테스트 문제는 프로그래머스 숫자의 표현(하단 링크) 입니다.https://school.programmers.co.kr/learn/courses/30/lessons/12924
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
조합수에서 코드 문법(?) 질문이 있습니다.
안녕하세요 강사님. 조합수(메모이제이션)에서 7번 라인에return dy[n][r]=DFS(n-1, r-1)+DFS(n-1, r);은 두 DFS의 값이 dy 배열에 저장되고, 그 값이 반환 된다는이중적인 의도가 있는건가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
해설 코드 질문있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요, 큰돌님 강의 정말 잘 수강하고 있습니다.다름이 아니라 해당문제에서 아래 go함수가 기존의 완탐 유형인 방문처리 / go / 방문처리 해제와는 조금 다르게 max가 중간에 들어가게 되어 헷갈리는 부분이 있어서 질문드립니다. 제가 이해한바로는 각 단계에서 가능한 모든 말을 이동시키고, 각 말이 도착한 위치에서 얻을 수 있는 점수를 계산.그 중에서 최대 점수를 선택한 후, 다음 단계로 넘어가며 또다시 최대 점수를 선택하는 과정을 반복.이렇게 마지막 주사위까지 처리된 후, 각 단계에서의 최대 점수를 더한 값이 최종적으로 출력.되는 로직으로 이해하였는데, 혹시 제가 이해한대로 실행되는게 맞는지 궁금합니다.int go(int here){ if(here == n) return 0; int ret = 0; for(int i = 0; i < 4; i++){ int temp_idx = mal[i]; int mal_idx = move(temp_idx, a[here]); if(isMal(mal_idx, i)) continue; mal[i] = mal_idx; ret = max(ret, go(here + 1) + v[mal_idx]); mal[i] = temp_idx; } //cout << "RET : " << ret << "\n"; return ret; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-O 반례나 어디가 문제인지 알 수 있을까요?
#include <iostream> using namespace std; string s; int n, ans, skip; int main(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> s; for (int i = 0; i < n; ++i) { int temp = 0; int flag = 1; for (int j = i; j < n; ++j) { char c = s[j]; if ((flag == 1 && c == ')') || (j == n - 1 && c == '(')) { break; } if (c == '(') flag <<= 1; else flag >>= 1; temp++; if (flag == 1) { ans = max(ans, temp); skip = (temp - 1); } } i += skip; skip = 0; } cout << ans << '\n'; }계속 1%에서 틀렸다고 나오네요..강의를 보고 다른 방법으로 풀었으나 처음 풀었던 방식에서 어디가 문제인지 알고 싶어 질문드립니다!커뮤니티, 백준 질문 게시판에 있는 반례들을 전부 통과했습니다..
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-L 질문드립니다.
안녕하세요 선생님. 먼저 해피추석 보내십쇼!!http://boj.kr/7fdb0fc2859a40888f5c0cd3583076ab 제가 궁금한 것은 두가지 입니다.위 방식대로 접근한것이 괜찮은지31번째 줄에서의 문제 31번째 줄에서 절대값을 이용했더니 답이 틀렸습니다.제출된 코드는 정답으로 나오는데 두 수의 차이에서 절대값을 넣었을 때 왜 틀리는지 모르겠습니다.// 틀림 auto it = find(start, numbers.end(), abs(numbers[i] - m)); // 맞음 auto it = find(start, numbers.end(), m - numbers[i]);
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
문제 접근 방법
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이번 문제를 제가 처음 접했을 때 완탐으로 먼저 생각했습니다. 제가 생각했을 때 격자 마다 5가지 경우의 수가 있다고 생각해서 대략 5^100이라고 생각했습니다. 아무리 색종이가 각 5개라는 조건이 있다해도 5^100 자체가 너무 커서 줄어들어도 시간초과가 날거라고 생각해서 다음 알고리즘으로 dp, 그리디 여러 방법을 도전했는데 실패했습니다.. 그런데 완탐, 백트래킹으로 가능했었다라니 어느 부분에서 그렇게 판단하신건지 궁금하여 커뮤니티를 보았는데 다른 여러 분이 이미 질문을 많이 하셨고 큰돌님께서 답변을 달아주셨습니다. 그런데 그 답변에서 이해가 안되는게 있습니다. --큰돌님 답변얼핏보면 100개의 격자점에서 상태값은 총 5개이기 때문에 5^100이라고 생각할 수 있습니다.그러나 문제 조건을 보시면. 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다.색종의 갯수의 제한이 있습니다.자 그러면.이렇게 생각할 수 있습니다.100개의 격자점에서 25개의 상태값을 순서와 상관없이 놓는 경우의 수죠.100C25라고 생각이 듭니다.근데 이것또한 큰 수입니다.242,519,269,720,337,121,015,504 이죠. 그러나 꼭 이래야만 할까요?5x5 짜리 색종이 4개면 100개의 격자점은 모두 채워지게 됩니다. 그리고 이 경우의 수는 한개밖에 없죠.자 그러면...100개의 격자점을 대충 4x4로 감싼다고 했을 때 거의 다 채워지기 때문에 4개정도가 들어가기 때문에100C4이면 -> 격자점이 다 채워지는 구나 -> 100 C4는 3,921,225(400만) 수준이고 -> 물론 그 외의 격자점을 다른 색종이로 채워야 하겠지만.. -> 400만이면 충분하지 않을까?그리고...사실 이것보다는 더 작을 수 있겠다. 라고 생각하고 들어간 것입니다.격자점은 0과 1로 이루어져있으며. (즉, 매번 100이 아니다.)5x5로 채울 수 있는 경우의 수들또한 있으니까요.그리고 100개의 격자점에 4x4가 아니라 사실은 4x4가 채워지면 채울 수 있는 영역 자체가 제한되기 때문에 더 적을 것이라고 생각했습니다.처음에는 저도 5^100이라고 생각을 했습니다.그러나 문제 조건을 보았을 때 10x10, 색종이의 갯수제한 5개를 보고 좀 더 작을 것이다. 라고 판단하고 어느정도 유추하고 -> 완탐 -> 줄일 수 있는 것은 줄여보자 -> 휴리스틱 -> 백트래킹 -> 이거 안되면 그리디로 해보자.라고 했을 때 백트래킹 단계에서 푼 것 같습니다. 이렇게 답변을 하셨는데요 여기서 의문점은 2가지 입니다.100개의 격자점에서 25개의 상태값을 순서와 상관없이 놓는 경우의 수죠. 이 말씀이 이해가 되지 않습니다. 저도 조건이 색종이가 각 5개라 25개이고 100개의 격자점에서 25개를 골라서 100C25 그 후에 11111,22222,33333,44444,55555 를 나열해서 가능한지 아닌지 판단해야하기 때문에 100C5* 25!/(5!*5!*5!*5!*5!) 이런 경우의 수가 나온다고 생각했습니다. 25!/(5!*5!*5!*5!*5!) 이거는 저렇게 중복된 숫자가 있을 때 나열하는 경우의 수 입니다. 왜 100개의 격자점에서 25개의 상태값을 순서와 상관없이 놓는 경우의 수인지 이해가 잘 되지 않습니다 -> 경우의 수가 이해가 안되는 거지 결론적으로는 너무 크다라는 결론은 이해했습니다.100개의 격자점을 대충 4x4로 감싼다고 했을 때 거의 다 채워지기 때문에 4개정도가 들어가기 때문에 이 문장이 이해가 가지 않습니다. 4*4로 총 5개까지 들어갈 수 있는거 아닌가요..? 100C5가 아니라 100C4 인지 이해가 되지 않습니다. 100C5라고 생각해서 약 7천만 정도가 나오고 남은 격자도 다른 색종이로 채운다고 생각해서 아마 처음 문제 푼 상태에서 여기까지 생각하더라도 7천만*a(다른 색종이로 채우는 경우의 수) 너무 많구나.. 생각하고 다시 풀어도 백트래킹까진 생각할 자신이 없네요 ㅠㅠ 마지막으로 큰돌님은 어느 정도 경우의수가 나올때 백트래킹으로 시간을 줄여서 성공할 수 있겠구나 라고 생각하시나요..? 일단 도전하고 안되면 빠르게 다음 알고리즘으로 생각을 전환하시는건지 아니면 본인만의 기준이 있으신건지도 궁금합니다!!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-P 질문입니다.
https://www.acmicpc.net/source/83888932비트마스킹으로 이 문제를 접근했습니다.각 톱니바퀴 회전 사이클을 처리할때 ,입력 톱니바퀴 idx기준 좌측과 우측으로 나눠회전 여부 및 방향을 rot배열에 저장하고 모든 탐색이 끝나면 rot배열을 참조해 회전을 하도록 만들었습니다.실행했을 때 원하는 값이 나오지 나오지 않는데 잘못된 로직이나 조건이 뭔지 찾기가 힘듭니다.답변 부탁드립니다, 선생님.
-
해결됨세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
2110번 문제 ispossible 함수 내부에서 조건문이 궁금합니다
안녕하세요 파라매트릭 서치 2110 풀다가 오답처리된 코드에 궁금한 점 생겨 질문드립니다. 정답처리된 코드import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class P2110 { static int N, C; static long result; static int[] home; static long parametricSearch() { long left=0; long right=home[N-1]-home[0]; long mid = (left+right)/2; while(left<=right) { if(isPossible(mid)) { left = mid+1; result = mid; } else { right = mid-1; } mid = (left+right)/2; } return result; } static boolean isPossible(long mid) { //그리디한판단 : 맨 첫번째를 두는게 이득 + 거리 mid만큼 떨어진 바로 다음 집에 두는게 이득 int cnt=1; int lastIdx=0; for (int i = 1; i < N ; i++) { if(home[i]-home[lastIdx]>=mid) { lastIdx=i; cnt++; } } return C<=cnt; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); home = new int[N]; for (int i = 0; i < N; i++) home[i] = Integer.parseInt(br.readLine()); Arrays.sort(home); System.out.println(parametricSearch()); } } 75%에서 오답처리된 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class P2110 { static int N, C; static long result; static int[] home; static long parametricSearch() { long left=0; long right=home[N-1]-home[0]; long mid = (left+right)/2; while(left<=right) { if(isPossible(mid)) { left = mid+1; result = mid; } else { right = mid-1; } mid = (left+right)/2; } return result; } static boolean isPossible(long mid) { //그리디한판단 : 맨 첫번째를 두는게 이득 + 거리 mid만큼 떨어진 바로 다음 집에 두는게 이득 int cnt=1; int lastIdx=0; for (int i = 1; i < N ; i++) { if(home[i]-home[lastIdx]>=mid) { lastIdx=i; cnt++; } if(cnt==C) return true; } return false; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); home = new int[N]; for (int i = 0; i < N; i++) home[i] = Integer.parseInt(br.readLine()); Arrays.sort(home); System.out.println(parametricSearch()); } } 다른 부분은 전부 동일하고최소거리가 mid일 때 공유기 C개를 두는 것이 가능한지 판별하는 isPossible 내부에서 return만 다릅니다.for (int i = 1; i < N ; i++) { if(home[i]-home[lastIdx]>=mid) { lastIdx=i; cnt++; } if(cnt==C) return true; } return false;설치할때마다 cnt를 증가시키고, cnt==C가 되는 시점에 도달하면 어차피 현재의 mid로 공유기 C개를 두는게 가능하단 의미니까 true를 리턴해서 끝내고, cnt==C에 도달하지 못한다면 C보다 적은 개수만 설치할 수 있으니 false를 리턴한다고 작성했습니다.반면에 강의안으로 제공해주신 코드에서는 반복문 안에서 판단해서 리턴하는 것이 아니라, 반복문 전부 돈 결과인 cnt와 C를 비교해서 리턴하는 것으로 이해했습니다. 정답풀이가 맞는 방식이라는 점은 이해가 가는데 오답풀이가 어떤 반례가 있는지는 잘 모르겠습니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요 강의 학습 방법에 대해 질문드립니다
먼저 현재 저는 백준 골드1을 찍기는했지만,대부분 그래프,완전탐색,시뮬레이션 위주로 풀었고 그 마저도 엄청 잘풀지는 않는? 그런 애매한 상황에 처한 수강생입니다 질문) 해당 강의의 경우 시간복잡도와 처럼 이미 알고있는 내용의 개념설명 같은 경우는 과감하게 스킵하고 추천해주신 문제 위주로 풀어도 될지 궁금합니다
-
해결됨SQL 코딩테스트를 위한 첫 걸음
workbench 테이블 생성
안녕하세요! workbench에서 스키마는 생성했는데 테이블은 어떻게 생성하나요? 제공해주신 세팅 코드를 입력해서 테이블 구조를 보고 싶은데 이 부분에서 해결이 안돼요.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
누적합 인덱스 1부터 질문
안녕하세요.누적합 psum 배열을 만들 때 인덱스 1부터 시작하라고 하셨는데요.그럼 누적합을 만들 원본배열 a같은 경우도 인덱스 1부터 시작해야하는건가요? int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int psum[11] = {0}; for(int i=1; i<11; i++) { psum[i] = psum[i-1] + a[i]; }이렇게하면 알려주신 공식과 다른 값이 나와서요
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-H 질문입니다.
http://boj.kr/19576287b7eb4247940b1b8e63b459f2 안녕하세요.어디가 틀렸는지 모르겠네요. ㅠㅠ선생님 풀이와 로직은 비슷한거같은데 반례를 못찾겠습니다.혹시 반례를 찾는 팁도 알려주시면 감사하겠습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-e 코드 질문 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.dp의 첫 인덱스에 알약 복용한 일차 / 두번째에는 0일시, 해당 일차에 1/2 꺼냈을 때 / 1일 시 해당 일차에 1 꺼냈을 때 이렇게 세팅하였는데, 결과가 잘 안나옵니다. 혹시 제 코드에 어떤 문제점이 있는지 알 수 있을까요?#include <bits/stdc++.h> using namespace std; int dp[64][2]; // dp[day][0] -> 남은 반쪽 약의 개수, dp[day][1] -> 남은 하나 약의 개수 int c; int move(int day, int tA, int tB) { if (tA <= 0 && tB <= 0) return 0; // 기저 조건 if (dp[day][0] != -1 && dp[day][1] != -1) return dp[day][0] + dp[day][1]; // 이미 계산된 상태 반환 int ret1 = 0; int ret2 = 0; // 반쪽 약을 먹는 경우 if (tA > 0) { ret1 += move(day + 1, tA - 1, tB); } // 하나짜리 약을 꺼내서 반쪽 약을 추가하는 경우 if (tB > 0) { ret2 += move(day + 1, tA + 1, tB - 1); } // dp 배열에 결과 저장 dp[day][0] = ret1; dp[day][1] = ret2; return ret1 + ret2; } int main() { cin >> c; memset(dp, -1, sizeof(dp)); // dp 배열 초기화 dp[1][0]=1; dp[1][1]=c-1; // 하나를 쪼개서 반이 된 상태임 // 첫째날은 반쪽 약 1개, 하나 약 c-1개로 시작 cout << move(1, 1, c - 1) << "\n"; return 0; }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-B 출력관련 질문드립니다.
http://boj.kr/2b235b78257544c8a6575820cf9e5d91 안녕하세요제가 풀었는데 출력을 해보면 마지막에 %가 붙어서 나오더라구요. 근데 코드를 올리면 정답이라고 뜨네요.%가 혹시 왜 붙어나오는지 알 수 있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-A 풀이 조합/순열 질문입니다.
http://boj.kr/f59749ffbbe643afad8bf3f22b8d3816 안녕하세요.nCr 강의에서 암기하라고 하셨던 combination 함수를 이용해서 풀었습니다.선생님 풀이에서 nPr로 풀이하셨는데 해당 방법도 알고있어야겠죠?nCr을 가르쳐주셔서 그방법으로 풀려고 고민했었는데, 왜 nPr로 풀이해주셨는지 궁금합니다.
-
미해결눈떠보니 코딩테스트 전날
문제 3 - 섬으로 건너가라.js
강의 마지막에 문제가 수정되었다고하니 너무 당황스럽네요 ㅠㅠ지금 노션에 있는 기대 값은 변함 없나요?오히려 강의 마지막에 나온것처럼 계산하면 기대 값과 다르게 나와서 질문 드립니다.입력 대기인원 = 14000605 출력 2025년 2월 413일 11시 0분 출발 입력 대기인원 = 1200202 출력 2020년 1월 1000일 11시 0분 출발
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
강의교안 질문입니다.
구조체 기반 sort를 사용할 때 주의 할 점(강의교안 137p) 내용이 잘 이해가 안됩니다. 글 내용만 봤을때 구조체 정렬 코드를 작성할 때 ">" 오퍼레이터 대신 "<" 오퍼레이터만 사용해서 정의 하라는 내용으로 이해를 했는데 이후 코드를 보면 ">" 오퍼레이터도 사용되는 것을 볼수 있습니다. 조금만 더 자세히 설명해주시면 감사하겠습니다!
-
해결됨코딩테스트 [ ALL IN ONE ]
반복문 강의에서
반복문 강의에서 다중반복문을 단축키로 한번에 만드시던뎅..어떤 단축키를 사용해야 하나요? c에서는 '*' 사용해서 했던 것 같은데.. 가물가물...
-
해결됨세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
백준 2110문제
def is_possible(k): # return True if k이상이 가능하면 global N, C, arr bef_idx = 0 cnt = 1 for idx in range(1, N): if arr[idx] - arr[bef_idx] >= k: bef_idx = idx cnt += 1 return (cnt >= C) 파라매트릭문제인 2110문제에서k가 1이라면cnt는 5가되는거고(예제기준으로) cnt >= C라는기준이사용해야하는 공유기 갯수(cnt) 그리고 주어진공유기 갯수(C)로 해석하면cnt가 C보다 크거나 같으면 주어진공유기보다 많이사용한거니까 false가 나와야하지않나요??? 그러면k=1일때는 공유기가3개주어졌는데 5개를써야하는데 k가 2일때부터 설명을 해주셔서 k=1일때의 설명이 없는이유가 궁금합니다