큰돌님 안녕하십니까? 해당문제 큰돌님과 비슷하게 접근까지하여 예제 까지는 통과 하였습니다. 아래 코드는 큰돌님 모범 답안 중 일부인데요, 볼드 처리 한 부분을 생각못해서 50%에서 틀린 것 같습니다. 지금이야 해설과 강의를 보고 그럴 수 있겠구나 하지만, 이런 부분을 생각 못했을 때는 반례를 생각하는 부분으로 접근하는게 맞을까요? bool check(int mid){ if(mx > mid) return false; // line 6 ...이하 생략 int main(){ cin >> n >> m; for(int i = 0; i < n; i++){ cin >> a[i]; sum += a[i]; mx = max(mx, a[i]); } ...이하 생략 아래는 큰돌님 모범답안 링크입니다. https://www.acmicpc.net/source/share/e575431157ef40f48ecb65d4426ffbcb
선생님 안녕하세요. 우선 강의 잘 듣고 있습니다. 감사합니다. 다름이 아니라, 제가 5-B 문제를 선생님 풀이방법과 거의 유사하게 풀었는데 답안 제출 시 시간초과가 발생하여 질문 드리게 되었습니다. 1차 for문을 돌면서 original 문자열을 1개씩 순회하며, 새로운 문자열을 만들어가며 폭탄 문자열 길이 이상이 되었을 때 뒤에서부터 폭탄 문자열과 비교하며 같으면 erase()로 제거하는 방식까지는 선생님 풀이방법과 똑같습니다. 다른 부분은 뒤에서부터 폭탄 문자열과 비교하는 부분입니다. 선생님께서는 substr을 만들어서 == 비교연산자를 통해 폭탄문자열을 찾으셨는데요. 저의 경우, 아래 링크로 공유드린 코드와 같이 check() 라는 함수를 만들었고, 거기서 폭탄문자열 길이만큼 for문을 돌며 폭탄문자열이 존재하는지 체크를 한 후, 존재하면 erase()를 하도록하였습니다. 즉, 폭탄문자열 체크하는 부분만 다르며, 선생님 풀이처럼 substr 후 == 비교연산자로 체크하는 부분으로 수정을 하면 시간초과없이 통과가 되는데, 제가 작성한 check() 함수를 사용하면 시간초과가 납니다. 제가 생각했을 때는 check()도 O(N)이고, == 비교연산자도 O(N)일 것으로 생각이 드는데 왜 check() 함수를 사용하면 시간초과가 나는지 이해가 안가서 질문드립니다. == 비교연산자가 O(N)이어도 문제 상에서 폭탄 문자열의 최대길이가 36 정도이기 때문에 시간초과가 발생하지 않았다고 생각을 했었고, 따라서 O(N)인 check() 함수도 시간초과가 발생하지 않을 것으로 생각했었습니다. http://boj.kr/fa122a7d9a5e456388da1c04be04ff69 감사합니다.
안녕하세요! 코딩테스트를 처음 준비하는거라 잘 모르는데.. 최솟값의 위치에서 그냥 min함수 이용하면 안되는 건가요...? nums = [7,10,5,3,2,15,19] min_value = min(nums) print(nums.index(min(nums))) 이런 식으로 하면 금방 나올텐데 원래 코딩 테스트는 순차탐색을해서 풀어야하는건가요? 잘 몰라서 여쭤봅니다!
http://boj.kr/5a31400e6a0e4bea85a7f0082562729d 안녕하세요 좋은 강의 잘 보고 있습니다. 저는 이 문제를 보고 백조가 이동해서 다른 백조에게 닿을 수 있는지 판단 => dfs 1이 아닐 때, bfs로 물 녹이기 반복 이렇게 생각해서 풀었고, 공유 소스나 다른 분들 질문을 보고 1번에서 dfs로 풀면 불필요한 과정을 더 수행하기 때문에 틀렸다는 것 또한 이해했습니다. 질문드릴 부분은 제 코드에서 dfs 말고도 다른 불필요한 로직이 있었는지 문제를 마주했을 때 dfs를 선택하면 안될 이유가 있었는지, 그걸 어떻게 제가 판단해야 할지 => 저는 1번 생각하자마자 dfs를 떠올렸고 시간초과를 띄우고 나서야 틀린걸 알았는데, 틀리기 전에 판단하려면 어떻게 해야 할까 싶어서 질문드립니다. 위 두가지 입니다. 감사합니다. ㅎㅎ..
안녕하세요 선생님! 4분33초부터 시작하는 DFS 예시 코드에 관련해서 질문이 있습니다. 선생님이 보여주신 그래프를 보면 노드의 개수가 총 5개인데 n의 크기를 보면 6이라고 되어 있네요. 처음에는 2와 4가 양방향으로 연결돼 있기 때문에 그런가 싶었는데 이걸 인접리스트로 표현하는 코드에선 n을 4로 하셔서 뭔가 제가 잘못 생각하고 있는가 싶어서 질문드립니다. n의 크기를 노드 개수대로 5로 수정해서 코드를 돌려보면 3번 노드를 탐색을 안 하는 걸 보면 n이 6이 돼야 할 거 같은데 왜 6이 되는지 이해가 잘 가지 않습니다 ㅠ
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님. 2주차까지는 어느정도 문제를 풀고 해설을 볼 수 있었는데 3주차 부터는 문제 해결을 못해서 강의를 보고 있습니다. 지금 계속 이런 상태라 학습을 제대로 하고 있는지 모르겠습니다. 일단 문제를 한 시간정도 보고 안풀려서 강의를 보고 다시 문제를 풀어 보고있는데 강사님의 풀이를 그냥 따라치는게게 아닌가 하는 걱정이 들어서 질문합니다.
큰돌님 안녕하세요 제가 문제를 잘 못 이해한게 아닌가 싶지만 질문 드려봅니다! 문제에서는 인접한 국가 인구의 차이가 특정 범위에 해당한다면 (연합국의 인구수) / (연합국의 개수) 로 배열을 변경한다 인데 그럴려면 먼저 dfs로 모든곳을 전부 순회한뒤에 구한 연합국의 인구수 / 연합국의 개수로 최종적으로 계산을 해줘야 할것같은데 정답코드 같은경우 커넥티드 컴포넌트에 해당되면 해당 컴포넌트 내에서 sum / v.size() 를 해주더군요 이렇게 되면 중간에 구해진 sum(인구수) v.size() (연합국의 개수) 로 구해지기 때문에 그다음 커넥티드 컴포넌트와 이전의 커넥티드 컴포넌트의 값이 다르게 되지 않나요?
배열 11. 임시반장 정하기 에서 문제를 풀고 있는데 해당 코드에서 런타임 에러가 발생하는데 이유를 알 수 있을까요? import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Main t = new Main(); Scanner in = new Scanner(System.in); int n = in.nextInt(); int[][] arr = new int[n][n]; // int[] arr2 = new int[n]; for (int i = 0 ; i < n; i++){ for (int j =0; j < n; j++) arr[i][j] = in.nextInt(); } // for (int i = 0 ; i < n; i++){ // arr2[i] = in.nextInt(); // } int test = t.solution11(n,arr); System.out.print(test); } // 11번 임시반장 private int solution11(int n, int[][] arr){ int answer = 0; int MAX = 0; for (int i =0; i < 5; i ++){ int cnt = 0; for (int j=0; j < n;j++){ int temp = arr[j][i]; for (int k =0; k <n; k++){ if (k == j) continue; else if (temp == arr[k][i]){ cnt++; } } if (cnt > MAX){ MAX = cnt; answer = j; } } } return answer; } }
처음에는 문제만 보고 1시간정도 고민해서 발상이 떠오르지 않았을 때만 발상 관련 강의를 보고, 그 다음에 또 1시간 동안 고민해서 발상을 코드로 옮기는 작업을 했는데도 테스트 케이스를 통과하지 못해서 마지못해 코드 구현 강의를 보았습니다. 그런데 이러한 bfs, dfs문제는 그냥 틀이므로 암기하라고 하셨을 때 허탈감이 들었습니다. 이러면 그냥 코테문제의 전형적인 틀이라고 받아들이고, 암기한 방법으로 다른 문제에 응용하면 되나요?