http://boj.kr/7606eba320de41679c31fffb9ff36d31 이 코드는 맞은 코드이고 http://boj.kr/44198150718f45fbaa3c3bee07710833 이 코드는 틀린 코드입니다. 두 코드에서 다른 부분이라고는 58번줄 if문에서 "n - m == 1" 이라는 조건이 들어가냐 마냐의 차이인데 저러한 조건이 없어도 모든 노드가 연결되기 위해서는 당연히 n - m == 1 조건이 만족되지 않나요? 만족하지 않는다면 애초에 모든 노드가 연결 안되지 않나요?
for x in range ( 1 , k + 1 ): # 가방 무게가 x일 때 # 물건을 담을 수 있을 때 (x보다 무게가 작거나 같을 때) if x < weight : dp [ y ][ x ] = dp [ y - 1 ][ x ] # 물건을 담을 수 없을 때 ( 전에 넣어뒀던 무게로 유지) else: dp [ y ][ x ] = max ( dp [ y - 1 ][ x ], dp [ y - 1 ][ x - weight ] + value ) 이렇게 나와있는데, x < weight이면 물건을 못담을때 아닌가요??
TreeSet이 중복되지 않는 것을 사용해서 풀어봤는데 설명해주신 내용과 어떤 차이가 있는지 궁금합니다. 코드입니다. public static String solution(int a, int[] arr){ String answer = "D"; TreeSet<Integer> set = new TreeSet<>(); for(int x : arr){ set.add(x); } if (set.size() == a){ answer = "U"; } return answer; }
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 큰돌님 다름이 아니라 해당문제를 잘 못 풀겠어서 큰돌님 풀이를 봤는데요 저는 맨처음에 문제를 풀때 좌표를 벗어나는지와 구멍인지를 for문 안에서 체크했는데요 for(int i = 0; i < 4; i++){ // 해당 좌표만큼 이동한다 int ny = y + dy[i] * value; int nx = x + dx[i] * value; if(!in(y, x) || b[y][x] == 'H') continue; ret= max(ret, down(ny, nx) + 1); } 이렇게 제출하니까 틀렸다고 떴습니다. 왜 for문 안에 넣으면 안되는 걸까요? 아래는 제출한 전체 코드입니다. #include <bits/stdc++.h> using namespace std; int t,a,d[54][54]; string s; char b[54][54]; bool check[54][54]; const int dy[4] = {-1, 0, 1, 0}; const int dx[4] = {0, 1, 0, -1}; // 좌표 내에 포함하는 지 체크한다 bool in(int aa,int bb){ return(1<=aa && aa<=t && 1<=bb && bb<=a); } int down(int y,int x){ // 이미 갔던 곳이라면 순회를 하는 코드이니까 -1을 출력하고 main함수 종료 if(check[y][x]){ cout << -1 << "\n"; exit(0); } //현재 좌표로 이동한 횟수 -> 이미 해당 위치에 숫자가 있다면 int &ret = d[y][x]; if(ret) return ret; check[y][x] = 1; int value = (int)b[y][x] - '0'; for(int i = 0; i < 4; i++){ // 해당 좌표만큼 이동한다 int ny = y + dy[i] * value; int nx = x + dx[i] * value; // 좌표를 벗어나거나 구멍이면 return 0 -> 갈 수 없음 if(!in(y, x) || b[y][x] == 'H') continue; ret= max(ret, down(ny, nx) + 1); } // 원복을 해준다 check[y][x] = 0; return ret; } int main(){ cin >> t >> a; for(int i = 1; i <= t; i++){ cin >> s; for(int j = 1; j <= a; j++){ b[i][j] = s[j - 1]; } } cout << down(1, 1) << "\n"; }
벽하나를 허물고 DFS를 반복해 풀이 처음에는 이 풀이 방법이 떠올랐는데요 벽의 개수가 어림잡아 250개고 벽을 허물고 모든 노드를 dfs를 250번을 돌아야하니 좀 비효율적인 느낌도 들고 시간 복잡도가 너무 커 안될 것 같다. 라고 느낌은 드는데요... 점화식으로 초과한다!가 계산이 안되어서 고민입니다.. 그래야 빨리 포기하고 다른 로직을 생각할텐데 아마 시험볼때는 시간에 쫓기다보니 다른 생각을 못할 것 같아서요.. 어떻게 사고하는게 좋을까요?
안녕하세요 기존에 파이썬으로 코딩테스트 공부 하다가, 큰돌님 유튜브 영상 보고 강의까지 입문하게 된 취준생입니다. 공부 계획을 짜던 중, 강의 순서가 주차 단위로만 나뉘어져 있고 일일 단위로는 안 나누어져 있어서 일일 계획을 짜기를 힘들어하고 있습니다. n주차 강의는 해당 주차에 끝내고 싶은데, 주차별로 일일 학습량에 대한 계산을 따로 해 두신게 있는지 궁금합니다. 없다면 어떤 식으로 하루 공부량을 잡아야 할지도 조언 부탁드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] <직접 구현하는 배열 리스트1 -시작 2:15초> 리스트의 정의를 보았을 때, 순서가 있고 중복을 허용하는 자료구조를 리스트라고 한다. 배열: 순서가 있고 중복을 허용하지만 크기가 정적으로 고정됨. 리스트: 순서가 있고 중복을 허용하지만, 크기가 정적으로 변할 수 있음. 배열은 리스트에 포함이 되는 것 같기도, 안 되는 것 같기도 합니다..! 정의를 보면 배열은 리스트에 포함되는 것 같고, 리스트와 대조해보면 리스트가 아닌 것 같아요..! 배열도 리스트 자료구조인가요..?
안녕하세요 선생님. 이전 두 질문에 대한 답변이 많은 도움이 되었습니다. 감사합니다. 2133번 문제의 DP 1번 풀이에서 O(N^2) 풀이를 소개해주셨는데 아래와 같이 dp 테이블을 갱신할 때 sum_dp 테이블을 같이 갱신을 해주면 시간복잡도가 O(N)으로 줄일 수 있지 않나 싶어 질문드립니다. N = int(input()) if N % 2 != 0: print(0) else: n = N//2 dp = [1] * (n+1) sum_dp = [1] * (n+1) for i in range(1,n+1): dp[i] = sum_dp[i-1] * 2 + dp[i-1] sum_dp[i] = sum_dp[i-1] + dp[i] print(dp[-1]) 그리고 이건 다른 종류의 질문인데 혹시 그래프 부분이 실제로 코테에 많이 등장하나요? 제가 조금 급하게 준비하고 있는 상태라 이론을 필수 알고리즘2까지만 들어도 될지 아니면 그래프까지 다 들어야될지 고민중입니다. 조언 주시면 감사하겠습니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. entry에 대해서, 뭔가 꺼림직한게 있어서 질문을 드립니다. entry에 대해서 더 자세히 설명해 주실 수 있으신가요? entry가 key와 value의 집합 이라고 이해가 되는데? 뭔가 애매해서 질문을 드립니다. 꺼림직하고 애매한데, 어떻게 설명해야 할지 어렵네요. 그래서 그냥 저가 느낌(생각) 그대로 질문을 올리는것입니다. 답변 부탁 드립니다.
코드 리뷰를 한번 보고 로직을 작성했는데 처음에는 이 방식으로 작성했습니다 if (visited[(turn+1) % 2][next]) continue; visited[(turn+1) % 2][next] = visited[(turn) % 2][now] + 1; 500000 0 을 입력했을 때 999가 나오면서 오답인데 선생님 코드는 if (visited[(turn) % 2][next]) continue; visited[(turn) % 2][next] = visited[(turn +1) % 2][now] + 1; 으로 -1 나오면서 정답인데 두 코드간의 차이를 모르겠습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 여기에서 public static void main(String[] args) { Scanner in = new Scanner(System.in); String input1 = in.nextLine(); Integer size = Integer.valueOf(input1); int[][] input2 = new int[Integer.valueOf(input1) ][Integer.valueOf(input1) ]; for (int i = 0; i < Integer.valueOf(input1); i++) { String[] temp = in.nextLine().split(" "); for (int j = 0; j < temp.length; j++) { input2[i ][j] = Integer.valueOf(temp[j]); } } int[] count = new int[size]; // 학생 번호 -> [V][] // 학년 -> [][V] // 자기자신 번호를 추가해도 문제X for (int i = 0; i < size; i++) { boolean[] matched = new boolean[size]; // 학년 for (int j = 0; j < size; j++) { int now = input2[i][j]; // 학생 for (int k = 0; k < size; k++) { int another = input2[k][j]; if (now == another){ matched[k] = true; } } } int matchedCount = 0; for (int j = 0; j < size; j++) { if (matched[j]){ matchedCount++; } } count[i] = matchedCount; } int max = 0; int maxStu = 0; for (int i = 0; i < size; i++) { if (count[i] > max){ maxStu = i; } } System.out.println(maxStu); } 어차피 자기자신은 항상 포함되어 기본값이 1이게될텐데, boolean[] matched = new boolean[size]; 에서 체크하는걸로 처리하였습니다. 이접근법이 틀린이유를 모르겠습니다. 1. 자기자신을 같이처리 (기본카운트는 항상 1부터) 2. 리스트에 매치된 학생들을 계산 후 마지막에 더함
제가 처음 코드를 작성했을 때 이렇게 작성했는데 시간초과가 났습니다. 여기서 처음 cnt를 1로 설정하고 N이 됐을때 break를 걸었습니다. 근데 여기서 선생님이 했던 방식으로 cnt를 N으로 설정하고 0이 될때 멈추니 시간초과가 안났습니다. 이게 바꾼 코드입니다. 왜 +/- 가 시간차이가 나는건가요? 동일한 방식인데 이해가 안갑니다.