무료
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
DNA 비밀번호 (백준 12891) 통과가 안됩니다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int[] myArr; // 내가 받은 문자열의 부분 문자열 조건 만족하는지 확인용 static int[] checkArr; // 주어진 부분 문자열 조건 static int checkSecret; // 모두 만족하는지 카운트 public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); int S = Integer.parseInt(stringTokenizer.nextToken()); // 문자열의 길이 int P = Integer.parseInt(stringTokenizer.nextToken()); // 부분 문자열의 길이 int result = 0; myArr = new int[4]; checkArr = new int[4]; checkSecret = 0; char[] A; // 주어진 문자열을 담을 배열 A = bufferedReader.readLine().toCharArray(); stringTokenizer = new StringTokenizer(bufferedReader.readLine()); for(int i = 0; i < 4; i++) { checkArr[i] = Integer.parseInt(stringTokenizer.nextToken()); if(checkArr[i] == 0) { // 주어진 조건이 0이면 이미 만족하기 때문에 checkSecret을 1증가시켜줌 checkSecret++; } } for(int i = 0; i < P; i++) { // 부분 문자열 처음 받을때 세팅 Add(A[i]); } if(checkSecret == 4) { result++; } for(int i = P; i < S; i++) { // 슬라이딩 윈도우 int j = i - P; Add(A[i]); Remove(A[j]); if(checkSecret == 4) { result++; } } System.out.println(result); bufferedReader.close(); } private static void Remove(char c) { switch (c) { case 'A': if (myArr[0] == checkArr[0]) { checkSecret--; myArr[0]--; } break; case 'C': if (myArr[1] == checkArr[1]) { checkSecret--; myArr[1]--; } break; case 'G': if (myArr[2] == checkArr[2]) { checkSecret--; myArr[2]--; } break; case 'T': if (myArr[3] == checkArr[3]) { checkSecret--; myArr[3]--; } break; } } private static void Add(char c) { switch (c) { case 'A' : myArr[0]++; if(myArr[0] == checkArr[0]) { checkSecret++; } break; case 'C' : myArr[1]++; if(myArr[1] == checkArr[1]) { checkSecret++; } break; case 'G' : myArr[2]++; if(myArr[2] == checkArr[2]) { checkSecret++; } break; case 'T' : myArr[3]++; if(myArr[3] == checkArr[3]) { checkSecret++; } break; } } }로컬에선 문제없이 동작하는데 백준에서는 계속 통과가 안되네요.. 혹시 동일하신분들 계실까요?
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
LCA 빠르게 구하기 Java 코드 시간초과
P11438 문제 교재 코드 그대로 쳤는데 시간초과가 발생하네요 ㅜ어딜 고쳐야 할까요 ㅠimport java.util.*; import java.io.*; public class Main { static ArrayList<Integer>[] tree; static int[] depth; static int kmax; static int[][] parent; static boolean[] visited; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); // 노드의 수 tree = new ArrayList[N + 1]; for(int i = 1; i <= N; i++) { tree[i] = new ArrayList<Integer>(); } StringTokenizer st; // 1. 인접리스트에 그래프 데이터 저장하기 for(int i = 0; i < N - 1; i++) { st = new StringTokenizer(br.readLine()); int s = Integer.parseInt(st.nextToken()); int e = Integer.parseInt(st.nextToken()); tree[s].add(e); tree[e].add(s); } depth = new int[N+1]; visited = new boolean[N + 1]; int temp = 1; kmax = 0; while (temp <= N) { // 최대 가능 depth 구하기 temp <<= 1; kmax++; } parent = new int[kmax + 1][N + 1]; // 2. depth와 바로 윗 부모 bfs로 구하기 bfs(1); // 3. 2^k 부모 구하기 for(int k = 1; k <= kmax; k++) { for(int n = 1; n <= N; n++) { parent[k][n] = parent[k - 1][parent[k - 1][n]]; } } int M = Integer.parseInt(br.readLine()); // 4. 질의 수행하기 for(int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); int LCA = excuteLCA(a, b); System.out.println(LCA); } } static int excuteLCA(int a, int b) { // 더 깊은 depth가 뒤에 오도록 변경 if (depth[a] > depth[b]) { int temp = a; a = b; b = temp; } for(int k = kmax; k >= 0; k--) { // 높이 빠르게 맞추기 if(Math.pow(2, k) <= depth[b] - depth[a]) { if(depth[a] <= depth[parent[k][b]]) { b = parent[k][b]; } } } for(int k = kmax; k >=0; k--) { // 조상 빠르게 찾기 // 최대 위로 올라가서 같은 부모를 가리키면 k를 1씩 감소하며 다른 지점을 찾음 if(parent[k][a] != parent[k][b]) { a = parent[k][a]; b = parent[k][b]; } } // 여기 온 것은 k = 0일때 고려 // case 1. k=0, 둘이 같은 노드를 가리킴 -> 그곳이 최소 공통 조상 // case 2. k=0, 둘이 다른 노드를 가리킴 -> 바로 위에가 최초 공통 조상 -> 2^0 위에 보기 int LCA = a; if(a != b) { LCA = parent[0][LCA]; } return LCA; } // bfs 구현 private static void bfs(int node) { Queue<Integer> queue = new LinkedList<>(); queue.add(node); visited[node] = true; int level = 1; int now_size = 1; int count = 0; while(!queue.isEmpty()) { int now_node = queue.poll(); for(int next : tree[now_node]) { if(!visited[next]) { visited[next] = true; queue.add(next); parent[0][next] = now_node; // 부모 노드 저장하기 depth[next] = level; // 노드 depth 저장하기 } } count++; // 자식 노드 모두 검사했는지 확인 if(count == now_size) { count = 0; now_size = queue.size(); level++; } } } }
- 해결됨Do it! 알고리즘 코딩테스트 with JAVA
스택문제 백준 1874
강의내용의 코드가 헷갈려서 아래내용대로 수정해보았는데 이렇게 해도 될까요 ? public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt(); // 수열의 개수int A[] = new int[N]; // 수열을 저장할 배열// 데이터 입력for (int i = 0; i < N; i++) {A[i] = sc.nextInt();} Stack<Integer> stack = new Stack<>();StringBuffer bf = new StringBuffer(); // 연산 출력 저장 int num = 1;for (int i = 0; i < N; i++) {int su = A[i];while (su >= num) { // 현재 수가 스택의 수와 같거나 큰 경우stack.push(num++);bf.append("+\n");}if (stack.isEmpty() || stack.peek() != su) {System.out.println("NO");return;}stack.pop();bf.append("-\n");} System.out.println(bf.toString()); // 결과 출력}}
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
백준11659 구간합 런타임 에러
하루코딩님 안녕하세요, 열심히 강의 들으면서 공부중입니다 항상 감사드려요public class tes { 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 M = Integer.parseInt(st.nextToken()); int[] arr = new int[N + 1]; StringBuilder sb = new StringBuilder(); st = new StringTokenizer(br.readLine()); for(int i = 1; i <= N; i++) { //누적 합 저장 arr[i] = arr[i - 1] + Integer.parseInt(st.nextToken()); } for(int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int start = Integer.parseInt(st.nextToken()); int end = Integer.parseInt(st.nextToken()); sb.append(arr[end] - arr[start - 1]).append("\n"); } System.out.println(sb); } } 위와 같이 구현을 하고 실제로 콘솔에서 제가 아래와 같이 입력하면 tokenizer에서 exception이 발생합니다5 3 5 4 3 2 1 Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.StringTokenizer.nextToken(StringTokenizer.java:347) at tes.main(tes.java:19) 디버깅을 해보면 첫번째 5 3 입력값은 잘 읽어서 tokenizer에 저장이 되었는데요,두번째 인풋인 "5 4 3 2 1"은 입력후 엔터를 치면 st = new StringTokenizer(br.readLine()); 라인을 넘어가면 실제 br(BufferedReader)에는 "[\n, 5, 4, 3, 2, 1, \n, , , , ,.. " 처럼 들어가 있는데 st(stringTokenizer)의 str 값을 보면 "" 이렇게 비어있어요 그래서 nextToken()이 없어 에러가 나는것같은데요 왜 제 itellij에서만 그럴까요 ? ㅠㅠㅠ jdk17 사용하고있습니다
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
백준 2178 미로탐색 질문 입니다.
안녕하세요.. 질문부터 말씀드리면,중첩 for문을 돌면서 입력값을 받을때, i는 y축, j는 x 축으로 알고있는데 bfs 호출 후 상하좌우 탐색 시, now의 0번째 값을 왜 x로 보시는지 알고싶습니다.. y가 아닌지... 짧은 지식으로 생각할때는 그런거 같아서요 ㅎㅎ 모든 2차원배열[][]은 y, x가 아닌건가요? ㅠㅠ 맨붕오네요 ㅋ
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
구간합구하기1 (백준11659)
선생님이 강의하시는데로 코드쳤는데 마지막 샘플예시처럼5 5 입력하면 => 1 이 나와야하는데 -14 가 나와버리네요코드가 동일한데 왜 결과가 다를까요 ㅠ이래는 작성한 코드입니다 public static void main(String[] args) throws IOException { // TODO Auto-generated method stub BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); int suNo = Integer.parseInt(stringTokenizer.nextToken());// 숫자의 개수 int quizNo = Integer.parseInt(stringTokenizer.nextToken());//질의개수 long [] s = new long[suNo+1]; //합배열 선언 stringTokenizer = new StringTokenizer(bufferedReader.readLine()); //한줄로 쭉 받아올때 stringTokenizer 사용 for(int i=1; i<=suNo; i++){ s[i] = s[i-1]+Integer.parseInt(stringTokenizer.nextToken()); } for(int i=0 ; i<s.length;i++) { System.out.print("s:"+s[i]+" "); } for(int q=0; q<quizNo; q++){ stringTokenizer = new StringTokenizer(bufferedReader.readLine()); int i = Integer.parseInt(stringTokenizer.nextToken()); int j = Integer.parseInt(stringTokenizer.nextToken()); System.out.println(s[j] - s[i-1]); } }
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
혹시 다른 ide에서 잘 돌아가는 프로그램이
백준에서는 안 돌아갈수도 있나요?다른 ide에서는 잘 돌아가는데 백준에 제출하니까 계속 틀렸다고 하네요!
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
내림차순으로 정렬하기 강의에서..
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); int A[] = new int[str.length()]; for(int i=0; i<str.length(); i++){ A[i] = Integer.parseInt(str.substring(i, i+1)); } for(int i=0; i<str.length(); i++){ int Max = i; for(int j = i+1; j<str.length(); j++); { if(A[j]>A[Max]) { Max = j; } } if (A[i] < A[Max]){ int temp = A[i]; A[i] = A[Max]; A[Max] = temp; } } for (int i=0; i<str.length(); i++){ System.out.println(A[i]); } } } 안녕하세요 강의 잘 보고 있어요.강사님이 치라는 대로 코드를 따라 쳤는데 계속 오류가 뜨네요?? (굵게 표시한 부분)cannot find symbol 오류인데.. 분명 j와 max를 잘 정의해 주었는데 왜 이러는 걸까요?
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
백준 11720 숫자의 합 질문 있습니다
문제를 보면입력첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.라고 조건이 주어지는데 강의의 풀이를 보면 숫자의 개수를 N개로 제한하는 부분이 없고 실행해보면 N개 이상 또는 이하의 숫자가 들어가도 상관이 없이 실행되는데 보통 코테에서도 이런식으로 제한에 러프하게 코딩해도 상관이 없는 건가요?아니면 문제에 제한이 있어서 코딩에서는 제한을 따로 두지않는건가요??
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
(숫자의 합)1<=N <=100 사이의 값
N이 1과 100사이의 값이 왜 char인지 보기위해서 모든타입의 범위를 보았는데 char 범위가 \u0000~\uffff(0~2^15-1)이더라구요 이게 1과 100의 값인건가요?
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
소수구하기-백준 1929 질문
안녕하세요 강의 너무너무 잘보고 있습니다소수구하기 백준 1929 강의 중for(소수의 배수값을 N까지 반복) for (int j=i+i; j<=N; j=j+i){ }이 부분에서 for문 시작 ( j=i+i )이랑 증감식 ( j=j+i ) 이 이해가 잘 되지않아질문 남깁니다.그리고 저 for문은 컨티뉴일 경우에는 실행이 안되는건가요 ?(ex)4이면 컨티뉴 >> 하고 for문을 도는건가요?) 감사합니다
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
12891_DNA비밀번호
package baekjoon; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer; public class p12891_DNA비밀번호 {static int[] myArr;static int[] checkArr;static int checkSecret; public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(br.readLine());int s = Integer.parseInt(st.nextToken());int p = Integer.parseInt(st.nextToken()); int result = 0;checkArr = new int[4]; // 비밀번호 체크 배열myArr = new int[4]; // 현재 상태 배열char[] a = new char[s];checkSecret = 0; // 현재 p개 중 몇개가 비밀번호 요건에 만족하는지 a = br.readLine().toCharArray();st = new StringTokenizer(br.readLine());for (int i = 0; i < 4; i++) {checkArr[i] = Integer.parseInt(st.nextToken());if (checkArr[i] == 0) {checkSecret++; // i번째 값은 이미 완성됨.}} for (int i = 0; i < p; i++) { // 부분 문자열 처음 받을 때 세팅Add(a[i]); // 현재 상태 배열에 담음} if (checkSecret == 4) {result++;} // 슬라이딩 윈도우for (int i = p; i < s; i++) {int j = i - p; // j = 맨 왼쪽, i = 맨 오른쪽Add(a[i]); // 오른쪽에 있는 값 추가Remove(a[j]);if (checkSecret == 4) {result++;}} System.out.println(result);br.close();} private static void Remove(char c) {switch (c) {case 'A':if (myArr[0] == checkArr[0]) // 같으면 이번에 빠짐으로써 충족이 안 되는 것이니까 checkSecret 하나 줄임checkSecret--;myArr[0]--;break;case 'C':if (myArr[1] == checkArr[1])checkSecret--;myArr[1]--;break;case 'G':if (myArr[2] == checkArr[2])checkSecret--;myArr[2]--;break;case 'T':if (myArr[3] == checkArr[3])checkSecret--;myArr[3]--;break;}} private static void Add(char c) {switch (c) {case 'A':myArr[0]++;if (myArr[0] == checkArr[0])checkSecret++; // 'A'가 더 많이 들어온다고 해서 checkSecret값을 올리면 되는 게 아니므로 딱 같을 때에만 증가시킴break;case 'C':myArr[1]++;if (myArr[1] == checkArr[1])checkSecret++;break;case 'G':myArr[2]++;if (myArr[2] == checkArr[2])checkSecret++;break;case 'T':myArr[3]++;if (myArr[3] == checkArr[3])checkSecret++;break;}}}현재 백준에서 문제가 통과되지 않고 있는데 혹시 잘못된 부분이라도 있을까요?ㅠ
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
숫자의 합 구하기
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int N = sc.nextInt(); String sNum = sc.next(); char[] cNum = sNum.toCharArray(); int sum = 0; for(int i=0; i<cNum.length; i++){ sum += cNum[i] - '0'; } System.out.println(sum); } }이 코드에서 int N = sc.nextInt(); 이렇게 한 이유가 문제 예제 이유 5, 54321 에서 5를 입력했기때문에 사용한 건가요??
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
안녕하세요 질문있습니다.
방향 그래프 무방향 그래프에 따라서 자료구조에 자료를 저장하는 방법이 다르다고 하셨습니다. 그런데 지금 이 문제에서는 방향그래프 아닌가요??간선,엣지들을 보면 모두 방향이 있는 거 같은데, 왜 무방향그래프를 저장할 때처럼 arraylist에 값을 저장하는지 모르겠습니다.
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
union 코드에 질문 있습니다.
union 메소드 구현할 때 저는 find(a)와 find(b) 중 더 작은 수로 통일하기 위해 static void union(int a, int b) { int a_rep = find(a); // a의 대표값 int b_rep = find(b); // b의 대표값 int min = a_rep<b_rep ? a_rep:b_rep; parent[a] = min; parent[b] = min; } 이렇게 코드를 짰는데요.이렇게 하니 에러가 나는데 이유를 모르겠습니다 ㅠㅠ 늘 좋은 강의 감사합니다.
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
[그리디 실전 문제] 최솟값을 만드는 괄호 배치 찾기 (백준 1541) - 반례를 못찾겠습니다 ㅠㅠ
안녕하세요!항상 좋은 강의 감사드립니다!덕분에 하루 하루 실력이 느는것이 느껴질 정도로 도움이 많이 되고있습니다! ㅎㅎ다름아니라 문제 36번 에서 같은 원리로 해결한 코드인데 백준에 재출했을 때 2% 에서 오답처리가 되었고,아무리 찾아봐도 잘못된 부분과 반례를 찾을 수 없어서 질문 남기게 되었습니다 ㅠㅠ아래는 제가 만든 코드입니다.항상 감사드립니다 :)import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String N = sc.next(); String[] split = N.split("-"); int result = 0; for (int i = 0; i < split.length; i++) { String[] A = split[i].split("\\+"); int sum = 0; for (int j = 0; j < A.length; j++) { sum += Integer.parseInt(A[j]); } result -= result == 0 ? sum * -1 : sum; } System.out.println(result); } }
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
[이진 탐색 실전 문제] 원하는 정수 찾기 편 질문
안녕하세요? 강의를 듣다가 궁금한 것이 생겨 질문 드립니다.자바의 정렬 기본 알고리즘 시간 복잡도와 이진 탐색 시간 복잡도가 nlogn인 건 이해했는데, 코드부를 보면 이중 반복문이 나오고 있습니다.앞 서 강의에서 반복문을 기준으로 이중 반복문이면 n의2승이라고 말씀하셨는데, 이 중 반복문을 썼는데도 nlogn이 되는 건 반복문이 진행되는 동안 절반씩 찾기 때문인가요??만약 이중 반복문으로 시간 복잡도가 올라간다면 이중 반복문을 쓰지 않고, 해결하는 방법을 알려주실 수 있으실까요?
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
연결요소의 개수 구하기(백준11724) 질문
DFS 함수 구현 부분에서 if(visited[v]){ return; } 처럼 탈출 조건을 사용하는 이유가 무엇인가요? 재귀를 시작하기전에 조건문으로 visited가 false일때만 시작하도록 설정했으니 필요없는 부분이 아닌가요?
- 해결됨Do it! 알고리즘 코딩테스트 with JAVA
소수구하기(백준1929) 오류
풀이에서 배열을 1부터 N까지 반복문을 돌며 현재 인덱스 값으로 초기화하는데1은 소수가 아니므로 2부터 N까지 반복문을 돌거나, 반복문이후에 A[1] = 0; 으로 초기화해야합니다.왜냐하면 문제의 입력 조건 범위가 1이상 1,000,000이하 이므로 M의 값이 1로 들어올 수 있기 때문입니다.
- 미해결Do it! 알고리즘 코딩테스트 with JAVA
5개의 데이터 중 3개가 이미 선택이 완료된 경우 점화식에 대해 질문드립니다.
선생님 안녕하세요좋은 강의를 만들어주신 덕분에 잘 보고 있습니다.조합으로 점화식을 도출해내신 것을 보고 궁금한 점이 생겨서 가르쳐주시면 감사하겠습니다. 강의 12분 540초에서5C3 = 4C2+4C3 점화식을 도출해내신 것을 보고제가 제대로 이해했는지 확인하기 위해 다른 시도를 해봤습니다. 위의 점화식은 5개의 데이터 중 4개를 이미 선택이 완료된 데이터로 가정했을 때 도출이 되는 식입니다. 그래서 저는 5개의 데이터 중 3개를 이미 선택이 완료된 데이터로 가정했을 때로 점화식을 도출해봤습니다.그래서D[5][3] = D[3][3] + (D[3][2] * 2) +D[3][1]라고 도출해봤는데, 혹시 제가 제대로 이해했는지 봐주시면 감사하겠습니다.