묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-J 주난의 난
http://boj.kr/33a1d8de2da14b3490eaa1b3effe36c0안녕하세요 강사님,이런식으로 작성해보았는데 코드 리뷰 부탁드려도 될까요??
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-p 질문 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 선생님 저도 선생님의 생각처럼 코드를 이렇게 작성하면 되겠구나 라는 생각을 했습니다. 하지만 결국 코드가 생각처럼 구현 되지 않았습니다.이코드에서 제 생각이 뭐가 틀렸고 어떤 부분이 미숙했던 걸까요? ㅜㅜ코드 사고 과정1. 전체 맵에서 조합으로 씨앗을 심고 visited 처리2. 3개 의visited 에서 위 아래 로 꽃이 펴지기3. 그중에서 합이 제일 작은거 출력 하기#include <bits/stdc++.h> using namespace std; bool visited[101][101]; int n,a[101][101], ret=987654321; const int dy[] = {-1, 0 , 1, 0}; const int dx[] = {0 , 1, 0 , -1}; vector<pair<int, int>> v; int solve(){ int sum = 0; for(int i =1; i < n; i++){ for(int j =1; j < n; j++){ if(visited[i][j]){ sum += a[i][j]; for(int i = 0; i < 4; i++){ int ny = i + dy[i]; int nx = j + dx[i]; if(ny < 0 || nx < 0 || ny >= n || nx >= n || visited[ny][nx]) { return 987654321; }; visited[ny][nx] = 1; sum += a[ny][nx]; } } } } return sum; } int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); cin >> n; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ cin >> a[i][j]; if(i >=1 && j >=1) v.push_back({i,j}); } } for(int i =1; i < n; i++){ for(int j =1; j < i; j++){ for(int k =1; k <j; k++){ visited[v[i].first][v[i].second] = 1; visited[v[j].first][v[j].second] = 1; visited[v[k].first][v[k].second] = 1; ret = min(ret, solve()); memset(visited, 0,sizeof(visited)); // visited[v[i].first][v[i].second] = 0; // visited[v[j].first][v[j].second] = 0; // visited[v[k].first][v[k].second] = 0; } } } cout << ret << "\n"; return 0; }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-F 1062번 문제 답안코드에서 이해가 가지 않는 부분이 있습니다.
int go(int index, int k, int mask) { if (k < 0) return 0; if (index == 26) return count(mask); int ret = go(index+1, k-1, mask | (1 << index)); if (index != 'a'-'a' && index != 'n'-'a' && index != 't'-'a' && index != 'i'-'a' && index != 'c'-'a') { ret = max(ret, go(index+1, k, mask)); } return ret; }답안에서 go 함수의 기저사례 처리 부분이 이해가 가지 않습니다.if (k < 0) return 0; if (index == 26) return count(mask); 이렇게 k < 0 일때는 0을 리턴해주고 index==26일때 읽을 수 있는 단어갯수를 리턴해주고 있는데요,문제의 조건이 K개의 글자를 가르쳤을때 읽을 수 있는 단어의 갯수의 최대값을 구하는 것인데위와 같이 index==26 일때 count(mask)를 리턴해주면 k개를 모두 고르지 않은, 예를 들어 k-2만을 고른, 상태일때 읽을 수 있는 단어를 리턴해주게 되지 않나요? 저는 그래서 if(k==0) return count(mask); if(index == 26 && k > 0 ) return 0;이렇게 k==0일때 (즉, k가지를 모두 골랐을때) count(mask)로 읽을 수 있는 단어의 갯수를 리턴해주고index가 끝까지 갔음에도 불구하고 k가 아직 0이 안되었을 경우에는 k개의 글자를 가르치지 못한경우이므로 0을 리턴하게 해주었는데이렇게 하니 틀렸다고 나오네요. 왜 이렇게 하면 안되는것인지, 그리고 왜 큰돌님께서 작성해주신 답안대로 해야되는지 이해가 가지 않아서 이렇게 질문드립니다. 답변해주시면 감사하겠습니다
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-K 시간초과 질문입니다
영상 보기전에 문제를 먼저 풀어보았는데로직 arr에 L 하나! 좌표를 p_y, p_x 담기반복 {한번 반복될때 마다 ans++del_y, del_x 두 queue를 만들고2중 for문 돌면서 빙산깍습니다 만약 빙산"X" 라면 del_y, del_x 에 push 합니다2중 for문이 끝나면 del_y, del_x에 있는 좌표들을 "." 로 수정합니다맵 bfs 돌면서 L 2개가 만날수 있는지 체크합니다방문배열 초기화!만날수 있다면 ans 변수 출력 }http://boj.kr/e5a6ee722f5b467ea793402242eb25f02% 시간초과가 뜨는데 어떻게 최적화를 해야할까요..
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-I 응용 질문있습니다 :)
안녕하세요 선생님 🙂 이 문제에 숨바꼭질 2번의 가장 빠른 시간으로 동생을 찾는 방법의 수와 숨바꼭질 4번의 이동 경로를 출력하는 방법을 넣어보고 싶어서 응용을 해봤습니다. http://boj.kr/140dd82426b947a59d51672a9bda4d0a 가장 빠른 시간으로 동생을 찾는 방법의 수를 출력하는 로직이 올바르게 짜여있는 것인지 궁금합니다. int prv[2][500004]; for (int i = K; i != N; i = prv[cnt%2][i]) { vec.push_back(i); //cnt--; } vec.push_back(N); reverse(vec.begin(), vec.end()); for (const auto& v : vec) { cout << v << " "; }prv배열을 2차원으로 했을 때, 1, 10을 입력하면 올바른 값이 나오지만 5, 17과 17, 5는 출력 자체가 되지 않습니다. prv배열을 1차원으로 했을 때는 5, 17과 17, 5는 출력이 되지만(5, 17만 올바른 값 출력) 1, 10은 출력 자체가 되지 않습니다. 혹시나 해서 for문에 cnt--를 넣어봤지만, 제대로 출력되던 1, 10조차 출력 자체가 되지 않았습니다. 이유와 해결방법이 궁금합니다.17 -> 16, 15, 14, 15 5 -> 6, 8, 11, 15위의 경우처럼 중복되는 경로가 있는 경우는 17 16 15까지만 출력이 됩니다. 14가 출력되지 않는 이유는 16 뒤에 출력되는 15가 첫번째 방문하는 15가 아닌 마지막 15를 방문해서 그런걸로 이해했는데 제대로 이해한게 맞을까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-I 질문있습니다 :)
안녕하세요 선생님 🙂 헷갈리는 부분이 있어서 질문 드립니다.http://boj.kr/4218885d4f8c48ae84582162f1d262f0 55번째 줄 while 문 안의 아래 if문을 사용하는 이유를 모르겠습니다.if (visited[cnt % 2][K]) { flag = true; break; } /* 17 -> 16, 15, 14, 15 5 -> 6, 8, 11, 15 */수빈이가 동생이 방문할 곳을 미리 방문할 경우에 왔다갔다 하는 부분을 구현한 것이라고 설명해주셨는데요, 로직은 이해가 됩니다. if (nx == K) { flag = true; break; } /* 17 -> 16, 15, 14, 15 5 -> 6, 8, 11, 15 */하지만, 위의 (17, 5)라는 입력 값만 생각했을 때는 78번째 줄의 nx = K일 경우에 반복문을 빠져나가는 로직으로도 충분히 정답을 도출해낼 수 있기 때문에, 55번째 줄의 조건이 필요한 이유를 모르겠습니다. 혹시 제가 놓치고 있는 개념이나 반례가 있을까요? 이러한 경우가 있을지는 모르겠지만 17 -> 16 -> 15 -> 14 -> 15 -> 16 -> 15같이 15를 3번 왔다갔다 해야하는 경우가 있다면, 55번째 줄과 78번째 줄 모두 정답을 도출해낼 수 없습니다. 이건 너무 많이 간거죠..?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
섹션 9 Dynamic Programming (동적 계획법) 최대부분증가수열
안녕하세요,최대부분증가수열을 수강한 뒤에 백준에서 유사한 문제를 발견해서 풀었는데https://www.acmicpc.net/problem/11053강의에서 배운 그대로 해당 코드를 제출했더니 틀렸다는 답변을 받았습니다..예제 입력은 맞게 나오는데 다른 테스트 케이스에서 틀린 것 같습니다..해당 문제에서 놓친 부분이 있을까요..?N = int(input()) arr = list(map(int, input().split())) arr.insert(0,0) dy = [0]*(N+1) dy[1] = 1 res=0 for i in range(2, N+1): max=0 for j in range(i-1, 0, -1): if arr[i] > arr[j] and dy[j]>max: max = dy[j] dy[i] = max+1 if dy[i]>res: res = dy[i] print(res)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-J 질문있습니다.
http://boj.kr/d4a41da7d56b4acfa374613ed7723eeb비트마스킹을 사용하지않고 무식하게 풀어보았는데 vscode에서는 계속해서 segmentation fault 오류가 나오고 백준에서는 메모리 초과가 뜹니다.이렇게는 해결이 어려울까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-L 재귀함수 질문이에요
http://boj.kr/3bb8f4f305654583be23c4a1f1aac037코드가 거의 큰돌님이 작성해주신거랑 로직이 비슷한데 왜 제가 작성한 코드는 시간초과가 발생하는지 모르겠습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-X 질문있습니다
int go(int here, int yamyam, int capacity){ if(here == m) return 0; int &ret = dp[here][yamyam][capacity]; if(ret) return ret; ret = max(ret, go(here + 1, yamyam, c)); // <--- 이부분 for(int i = 0; i < n; i++){ bool isbeforeYAM = (1 << i) & yamyam; bool isYAMCAN = (capacity - a[i]) >= 0; if(!isbeforeYAM && isYAMCAN)ret = max(ret, go(here, yamyam | (1 << i), capacity - a[i]) + 1); } return ret; }이 go라는 메소드에서 ret = max(ret, go(here + 1, yamyam, c)); 이 이해가 가지 않습니다.다음 가방으로 넘어가는데 왜 현재의 (가방, 보석, 용량) 에 값을 저장하나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-h 질문있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. https://www.acmicpc.net/submit/4659/85159031안녕하세요. 선생님 문제를 푸는 와중에 예시 답안은 맞는데 제출하면 틀렸다고 하는데 어떤 부분이 틀렸는지 잘 모르겠습니다 ㅠㅠ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 질문있습니다 :)
안녕하세요 선생님 🙂 오랜만에 질문드리는 것 같습니다 ㅎㅎ 사실 이 문제에서 모르는 부분이 있는 것은 아니지만, 별거 아닌 실수로 인해서 발생한 부분에 의문이 생겨서 질문 드립니다. 실수로 visited배열을 전체 초기화가 아닌 54 * 54만큼만 INF로 초기화시켜주었습니다. 테스트케이스는 4 * 4 배열인데요, 실수를 했어도 테스트케이스의 범위는 지켰기 때문에 결과 값이 정상적으로 나와야 한다고 생각합니다. 하지만, 테스트케이스의 결과 값이 "IMPOSSIBLE"로 출력이 됩니다. 이유가 뭘까요..?? http://boj.kr/b731d2b778284e37b9aa54fb079a30ba
-
해결됨김영한의 실전 자바 - 중급 2편
직접 구현하는 연결 리스트2- 데이터 추가 삭제1, 코드 리뷰 좀요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 영상 강의를 보면서 영상에 나온 그림을 보면서 코드를 만들어봤습니다.그래서 코드 리뷰 좀 받고 싶게 되더군요.좀 부족하지만 올립니다.힌트는 동영상에 나오는 그림에 나오는 노드 연결 했을때 나오는 코드(초록색 으로 칠해져 잇는 그림 들) 를 보고 영상을 돌려보면서 만들었습니다.메인이 된것은 NodeMain3에서 스테틱 메서드 입니다.반환이 안되면 값이 똑같이 나와서 반환을 해주었습니다.(이유를 모르겠음)메인 코드 결과추가1인덱스 리무브에서, 맨마직꺼 리므브는 안되겟네요. 올리고나서 발견..추가2설명 하라고 하신다면 솔직히 못 하겠습니다. sout로 node 값 찍어 보고, 어찌저찌 하다가 된거 라서요. 답변 부탁 드립니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5 - G 투포인터 low,high 시작 위치 질문
http://boj.kr/0078fb786ad54f33b71c760f7301177f우선 보았을 때, 저는 low를 0 high를 a.size()로 두었습니다. 그리고 아래와 같은 로직으로 짰는데, 시간 초과가 나더라구요... 일반적으로 실행해도 감소만 시키느라 답변이 나오지더 않더라구요.low, high를 처음에 두신 이유가 있으신지 궁금합니다! ll l = 0, r = a.size(); while (l != r) { ll sum = 0; for (ll i = l; i < r; i++) sum += a[i]; if (sum < n) { l++; } else if (sum > n) { r--; } else if (sum == n) { l++; ret++; } }
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2 - H 수학문제
https://www.acmicpc.net/source/85152489BigInt로 정렬해서 풀었는데 틀렸다고 나오더라구요 ㅜ3%에서 틀리는데 왜 틀리는지를 모르겠습니다 ㅜ
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5 - E 풀이까지 가는 생각
항상 그리디가 어려웠는데 오랜만에 풀어보니 답은 맞는데, 뭔가 이게 맞나라는 생각이 너무 들어서 생각 흐름이 맞는지 질문드립니다!블로그에 개인적으로 정리한 글이라 반말인점 무시해주시면 감사하겠습니다 ㅠ 무식하게 하기엔 범위가 10만이고 범위가 존재해서 그리디가 생각났다. 우선, 위 사진처럼 생각해봤다. 순서 정렬은 start 시간 기준으로 하는게 맞다. 왜냐하면 회의 시간이 짧은 걸로 sort 하면 100000에 시작하고 100001로 끝나는 게 처음에 배치되기 때문이다. 끝도 의미가 없으니 시작으로 순서 정렬을 잡았다.그럼 어떤 예외가 있을까 싶었는데 사진의 맨 위에 엄청 긴 선 같은 부분이 문제다. start가 가장 작으니 배열의 처음에 위치하기 때문이다. 따라서if (prev_s < s && e < prev_e)위와 같이 이전 값의 사이에 현재 해당 값이 존재하면 (이전 = 긴 선, 현재 = 긴 선 다음으로 start가 빠른 선) 면적은 줄지만 다른 회의가 잡힐 공간 자체는 늘어나게 되니 무조건 이득인 것이다. 따라서 저럴 땐, 이전 친구를 pop해주고 현재 친구를 push 해줬다.이외에 이전의 끝과 현재의 시작이 겹치거나 더 크면 회의실을 잡을 수 있으니 push 해준다. 반대의 경우는 회의중이기 때문에 회의실을 잡지 못하기 때문에 따로 push 해주지 않는다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-G 질문있어요
http://boj.kr/5bd8b854c5154aa3bebd77b37b07b8a1시간복잡도는 O(n*comp)으로 보이고 메모리도 넘지 않는 것 같은데 예제들은 정상 작동하면서 제출할때는 틀렸다고 나옵니다. 반례가 무엇인지 도저히 모르겠습니다.
-
미해결2주만에 통과하는 알고리즘 코딩테스트 (2024년)
7강 RGB 색칠하기 질문 있습니다.
// 아래 풀이법에서 제시해주신 풀이법과 비슷하게 풀이한 것 같으나 백준에서는 자꾸 45% 쯤에서 오답처리가 됩니다 ㅜㅜ... 제 알고리즘에 어떤 문제가 있는 걸까요... #include <iostream> #include <vector> using namespace std; int N; vector<int> R; vector<int> G; vector<int> B; int dp[1001][3]; void Input() { cin >> N; for(int i = 0; i < N; i++) { int r, g, b; cin >> r >> g >> b; R.push_back(r); G.push_back(g); B.push_back(b); } } void DP() { dp[0][0] = R[0]; dp[0][1] = G[0]; dp[0][2] = B[0]; for (int idx = 1; idx < N; idx++) { for (int rgb = 0; rgb < 3; rgb++) { if (rgb == 0) { dp[idx][rgb] = min(dp[idx - 1][1], dp[idx - 1][2]) + R[idx]; } else if (rgb == 1) { dp[idx][rgb] = min(dp[idx - 1][0], dp[idx - 1][2]) + G[idx]; } else if (rgb == 2) { dp[idx][rgb] = min(dp[idx - 1][0], dp[idx - 1][1]) + B[idx]; } } } int minVal = INT16_MAX; for (int i = 0; i < 3; i++) { if (dp[N - 1][i] < minVal) { minVal = dp[N - 1][i]; } } cout << minVal << endl; } void Solve() { DP(); } int main() { Input(); Solve(); }
-
해결됨세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
11726 런타임 질문
안녕하세요 강사님, 백준 11726번 관련 질문 드립니다. 노션에 나온 정답지는# input N = int(input()) # solve dp = [0] * (N + 2) dp[1] = 1 dp[2] = 2 for n in range(3, N + 1): dp[n] = (dp[n-1] + dp[n-2]) % 10007 print(dp[N]) 으로 되어있습니다.그런데 강의에서는 dp = [0] * (N + 2)부분이 dp = [0] * (N + 1)로 되어있습니다. 백준에 dp = [0] * (N + 1)로 제출하면 런타임 에러가 발생하는데,그 이유를 알 수 있을까요?dp[N]까지 접근하는건데, 0번째 인덱스를 고려한 N+1이아닌, N+2는 왜 필요한지 모르겠습니다.(강의나 노션에 추가 설명이 보이지 않아서 여쭤봅니다) 감사합니다.
-
미해결카카오 코테 6주 합격! 실전 파이썬 코딩테스트
추천문제 2667번 질문이 있습니다.
import sys sys.setrecursionlimit(10000) input = sys.stdin.readline N = int(input().rstrip()) graph = [list(map(int, input().rstrip())) for _ in range(N)] dy = [-1, 1, 0, 0] dx = [0, 0, -1, 1] visited = [ [False] * N for _ in range(N) ] distances = [] def dfs(y, x): stack = [(y, x)] distance = 1 while stack: cy, cx = stack.pop() for i in range(4): ny = cy + dy[i] nx = cx + dx[i] if 0 <= ny < N and 0 <= nx < N: if graph[ny][nx] == 1 and not visited[ny][nx]: visited[ny][nx] = True stack.append((ny, nx)) distance += dfs(ny, nx) return distance for i in range(N): for j in range(N): if graph[i][j] == 1 and not visited[i][j]: distances.append(dfs(i, j) - 1) print(len(distances)) for d in sorted(distances): print(d)이렇게 제가 풀어봤는데요, 예시 입출력은 잘 나오는데 백준에 제출하면 틀렸다고 나오네요.어느 부분에서 반례가 있는 것일까요?