- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. else if 문 말고 when 버전으로도 알려주시면 좋을 것 같아요
T, M, N, K를 입력받아 사용한다고 하셨는데, M과 K는 각각 세로와 가로값으로 입력받고, K는 배추의 위치라는것을 알았습니다. 근데 T는 테스크케이스 라는 언급을 하셨고 코드에서도 아래와 같이 작성되있습니다. while (T-- > 0) { StringTokenizer st = new StringTokenizer(br.readLine()); M = Integer.parseInt(br.readLine()); N = Integer.parseInt(br.readLine()); K = Integer.parseInt(br.readLine()); // map 정보 // dfs 수행 .... } 2번의 테스크케이스를 만드는 이유는 무엇인가요? 그리고 단순히 궁금해서 여쭤보는데 가로와 세로 순서로 입력받고 코드를 실행하는것이 아닌 거꾸로 세로와 가로 순으로 실행하는지 궁굼합니다. 답변 부탁드립니다. 감사합니다.
안녕하세요. 위의 코드는 제가 강의를 듣기 전에 작성한 코드입니다. 백준에서 2가지로 주어진 테스트 케이스는 통과하는데 코드를 제출하면 틀렸다고 나옵니다. 코드 어디가 잘못된지를 모르겠습니다. 그리고 강의에서는 dfs 함수에 start 변수만 넣지 않고 count 변수도 넣으셨는데 count변수를 매개변수로 넣지 않고 코드를 작성하는 방법이 있는지 궁금하고, 이러한 방법이 없다면 왜 매개변수로 count 변수를 넣어줘야 하는걸까요?
처음에 아래와 같은 식으로 하드코딩 했는데, out으로 나오는 답이 메모장에 있는 답과 같은데 정답이 아니라고 떠서 질문 남깁니다. 왜 틀린 건지 알 수 있을까요? #define CRT SECURE_NO_WARNINGS #include <stdio.h> int main() { int n, input; int a[101], b[101]; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", &input); a[i] = input; } for (int i = 0; i < n; ++i) { scanf("%d", &input); b[i] = input; } for (int i = 0; i < n; ++i) { // a가 가위를 낸 경우 if (a[i] == 1) { if (b[i] == 1) { printf("D\n"); } else if (b[i] == 2) { printf("B\n"); } else { printf("A\n"); } } // a가 바위를 낸 경우 else if (a[i] == 2) { if (b[i] == 1) { printf("A\n"); } else if (b[i] == 2) { printf("D\n"); } else { printf("B\n"); } } // a가 보를 낸 경우 else if (a[i] == 3) { if (b[i] == 1) { printf("B\n"); } else if (b[i] == 2) { printf("A\n"); } else { printf("D\n"); } } } return 0; }
public class Main { public static int solution(int[] value, int N) { int[][] dynamic = new int[N + 1][N + 1]; int[] sum = new int[N + 1]; for (int i = 1; i <= N; i++) { dynamic[i][i] = value[i]; } sum[1] = 1; for (int i = 2; i <= N; i++) { sum[i] = sum[i - 1] + value[i]; } for (int i = 1; i < N ; i++) { for (int j = 1; j <= N - i; j++) { dynamic[j][j + i] = Math.max(dynamic[j + 1][j + i], dynamic[j][j + i - 1]) + (sum[j + i] - sum[j - 1]); } } return dynamic[1][N]; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); int[] value = new int[N + 1]; for (int i = 1; i <= N; i++) { value[i] = Integer.parseInt(br.readLine()); } System.out.println(solution(value, N)); } } 강사님, 안녕하세요! 강의 보고 구현한 코드인데, 백준에서 채점이 틀리게 나와서 혹시 로직이 틀린건지 궁금합니다. [해결 됐습니다!] 1부터 n까지 합 저장하는 배열인 sum을 초기화하면서 sum[1] = value[1] 을 해야 할 것을 sum[1] = 1; 로 잘못 초기화 했네요. 우연히 테스트 케이스 value[1] 값이 1이어서 해당 답만 맞았던 것 같습니다. 강의 보면서 실력이 늘고 있음을 느끼고 있습니다. 감사합니다:)
강의를 보는데 이해가 안되는부분이 있어 질문드립니다 그리디 문제의 경우는 실제로 해당경우에 대한 모든 경우의수가 대입된다면 임의의 해답논리를 이용해서 푼 경우가 진짜 정답은 아닐 수 있으나 문제에서 제시되는 테스트케이스는 해당 논리에대해서는 참 이라는 조건이 제시되는 문제로만 구성되있다고 생각하면 되는걸까요?
안녕하세요 강사님. 수업 너무 잘 듣고 있습니다. 궁금한게 있어 질문 드립니다. 제가 딕셔너리를 이용해서 아래와 같이 풀었는데 강사님 코드를 보니 너무 깔끔하더라구요. " from collections import defaultdict def solution(nums, target): answer = [0]*2 dicts = defaultdict(int) for i in nums: dicts[i]=target-i for i in dicts: if i in nums and dicts[i] in nums and i!=dicts[i]: return [min(i,dicts[i]),max(i,dicts[i])] return answer " 이렇게 IF문 안에 여러 조건들을 넣어서 풀어도 시간 복잡도가 O(N^2)이 안되고 O(N)이 될까요??
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. import java.util.Arrays; import java.util.List; import java.util.Scanner; public class Main { public String solution(String str) { String[] arr = str.split(""); List<String> list = Arrays.asList(arr); List<String> resultList = list.stream().distinct().toList(); StringBuilder answer = new StringBuilder(); for (String s : resultList) { answer.append(s); } return answer.toString(); } public static void main(String[] args) { Main T = new Main(); Scanner kb = new Scanner(System.in); String str = kb.nextLine(); System.out.println(T.solution(str)); } } 위 코드가 저의 개발환경에서는 돌아가는데 채점서비스에서는 컴파일에러가 뜹니다ㅜ 원인을 잘 모르겠습니다.
안녕하세요. 코딩테스트를 1년간 준비중인 취업 준비생입니다. 강사님의 친절한 코딩테스트 강의에 감탄하며 잘 듣고있습니다. 펠린드롬 첫번째 문제에서요. 홀수인 Key의 개수로 푸는 문제라는건 전혀 생각하지 못한 부분이라 동기부여가 많이 되었습니다. 강사님의 오티에서처럼 처음에 15분 스스로 풀어보고 안돼면 강의 보고 복습하면서 사고력을 키우라고 말씀하셨는데 그렇게 해봐도 사고력 때문인지 새로운 문제에 도전하면 할 수록 안풀리고 그러는데 조언 좀 부탁드려도 됄까요? 그리고 강사님꼐서 풀어주신 방법 말고 문자열의 개수를 세어서 전체 개수가 홀수 인지 짝수인지를 가지고 물론 예외가 있다는것을 알지만 풀었다고 강의를 수강하긴 했었습니다. 전체 개수가 홀수면 True 짝수면 False 이런식으로요. 조언 부탁드립니다 강사님.
코드에 대한 질문이 있습니다. 아래는 제가 짠 코드입니다. 다른 부분은 볼 필요 없이 dfs(i, j) 이 부분에 대한 궁금증이 있습니다. 저는 dfs(i, j) ... void dfs(int y, int x)이런식으로 짰는데 강사님 코드를 보면 dfs(i, j, v) ... void dfs(int y, int x, vector<pair<int,int>> &v) 이런식으로 줬습니다. 이렇게 짜야하는 이유가 궁금합니다. 이에 대한 제 예상 해답은 벡터에 call by reference를 적용했기 때문인데 왜 call by reference를 적용해야하는지를 모르겠습니다. 벡터에 call by reference를 적용한다고 치면 void dfs 안에 있는 다른 변수들(sum, cnt) 같은 변수들도 dfs(i, j, sum, cnt) 이런식으로 줘야하는것이 아닌가요? call by value, call by reference 부분 교안을 봐도 이해가 되지 않아서 질문드립니다. 자세한 답변 부탁드립니다 #include <bits/stdc++.h> using namespace std; const int dy[4] = { -1 ,0, 1, 0 }; const int dx[4] = { 0, 1, 0, -1 }; int n, l, r, a[55][55], visited[55][55], sum, cnt; vector<pair<int, int>> v; void dfs(int y, int x) { visited[y][x] = 1; for (int i = 0; i < 4; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if (ny < 0 || ny >= n || nx < 0 || nx >= n) continue; if (visited[ny][nx]) continue; if (abs(a[y][x] - a[ny][nx]) >= l && abs(a[y][x] - a[ny][nx]) <= r) { v.push_back({ ny, nx }); sum += a[ny][nx]; cnt++; dfs(ny, nx); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> l >> r; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> a[i][j]; } } int ret = 0; while (true) { int flag = 0; fill(&visited[0][0], &visited[0][0] + 55 * 55, 0); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (visited[i][j]) continue; v.clear(); visited[i][j] = 1; v.push_back({ i, j }); cnt = 1; sum = a[i][j]; //1. 왜 여기 dfs에서 dfs(i, j, v)로 줘야하는지? //2. 만약 이에 대한 해답이 call by reference 이면 //위에 따로 빼놓은 dfs 함수 부분에서 //sum, cnt 이런 변수들도 똑같이 dfs(i, j, sum, cnt) 이런식으로 넣어줘야 하는 것이 아닌지? dfs(i, j); if (cnt == 1) continue; for (pair<int, int> b : v) { a[b.first][b.second] = sum / cnt; flag = 1; } } } if (!flag) break; ret++; } cout << ret << '\n'; return 0; }