-
구름톤 챌린지 1주차(230816~230818)구름톤 챌린지 2023. 8. 16. 11:34
230816
Day3 문제풀이
코드
import java.io.*; class Day3 { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int sum = 0; int T = Integer.parseInt(br.readLine()); for(int i=0; i<T; i++) { String[] fomula = br.readLine().split(" "); int a = Integer.parseInt(fomula[0]); String operator = fomula[1]; int b = Integer.parseInt(fomula[2]); switch(operator) { case "+" : sum += (a + b); break; case "-" : sum += (a - b); break; case "*" : sum += (a * b); break; case "/" : sum += (a / b); } } System.out.print(sum); } }중요
한 문장을 나누는 방법에는 split()으로 분할하는 방법이 있지만. StringTokenizer를 사용하는 방법도 있다.
이번 문제에서는 나누어 저장하는 값이 적어 split()을 사용하였지만,
반복적으로 나누어 저장해야 하는 값일 경우 for문에 StringTokenizer의 nextToken()을 사용하면 좀 더 효율적으로 코드를 작성할 수 있다.230817
Day4 문제풀이
코드
import java.io.*; import java.util.*; class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); Integer[] array = new Integer[N]; int target = 0; for(int i=0; i<N; i++) { array[i] = sc.nextInt(); if(array[i] > target) target = array[i]; } int sum = array[0]; boolean up = true; int pre = array[0]; // N이 1일 경우 return if(N == 1) { System.out.println(sum); return; } // 처음부터 내림차순일 경우 if(pre == target) { pre = Integer.MAX_VALUE; up = false; } // 햄버거 확인 for(int i=1; i<N; i++) { sum += array[i]; // 오름차순이어야 함 if(up) { // 오름차순에 맞지 않을 경우 return if(array[i] < pre) { System.out.print(0); return; } pre = array[i]; // 가장 높은 재료일 시 내림차순으로 전환 if(array[i] == target) { pre = Integer.MAX_VALUE; up = false; } } // 내림차순이어야 함 else { // 내림차순에 맞지 않을 경우 return if(array[i] > pre) { System.out.print(0); return; } pre = array[i]; } } System.out.println(sum); } }중요
- 문제에서는 정렬을 활용하여 문제를 풀이하라고 나와있는데, 나는 최댓값을 사용하여 풀이하였다. 내가 생각한 정렬을 이용한 풀이는 우선 최댓값의 인덱스를 알아내야 하고 젇렬 여부를 확인하기 위해 슬라이싱을 이용한 추가 변수가 필요했다. 이처럼 풀이하면 코드가 더 복잡해진다. 정렬을 이용한 문제의 풀이에 대해 좀 더 생각해 볼 필요가 있다.
- 처음부터 내림차순으로 진행되어야 하는 경우를 놓쳐 마지막 테스트 케이스를 계속 실패했다. 나올 수 있는 경우의 종류를 잘 생각해보고 이에 맞는 테스트케이스를 작성하는 연습을 해야겠다.
- 처음에 문제를 제대로 이해하지 못해 중간값을 기준으로 오름차순/내림차순을 해야 하는 코드를 작성하였다. 이후 다시 읽어보니 중간값이 아닌 최대값을 기준으로 오름차순/내림차순을 하는 것이었다. 문제를 제대로 읽고 이해하는 자세가 필요하다.
230818
Day5 문제풀이
코드
import java.io.*; import java.util.*; class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tk = new StringTokenizer(br.readLine(), " "); int N = Integer.parseInt(tk.nextToken()); int K = Integer.parseInt(tk.nextToken()); tk = new StringTokenizer(br.readLine(), " "); int[][] list = new int[N][2]; for(int i=0; i<N; i++) { list[i][0] = Integer.parseInt(tk.nextToken()); list[i][1] = countBinary(list[i][0]); } Arrays.sort(list, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { if(o1[1] == o2[1]) return o2[0] - o1[0]; else return o2[1] - o1[1]; } }); System.out.print(list[K-1][0]); } public static int countBinary(int num) { int count = 0; while(num != 0 && num != 1) { if(num % 2 == 1) count++; num /= 2; } if(num == 1) count++; return count; } }중요
- new Comparator를 사용하여 이중 배열을 정렬하는 것은 자주 해왔지만, 자동완성 없이 작성하는 것은 어려웠다. 시험장에서는 자동완성을 사용하지 못하니 자동완성을 사용하지 않고도 코드를 작성할 수 있는 능력을 길러야 한다.
- 이번 문제에서는 2진수에서 1의 개수만 체크하면 되었지만, 2진수의 경우 나머지 연산을 한 후 그 값을 거꾸로 뒤집어야 해당 수의 2진수가 됨을 잊지 말자.
- 내림차순의 경우 o2-o1, 오름차순의 경우 o1-o2 이다
'구름톤 챌린지' 카테고리의 다른 글
구름톤 챌린지: 3주차(230830~230901) (0) 2023.08.30 구름톤 챌린지: 3주차(230828~230829) (0) 2023.08.28 구름톤 챌린지: 2주차(230823~230825) (1) 2023.08.24 구름톤 챌린지: 2주차(230821~230822) (0) 2023.08.21 구름톤 챌린지: 1주차(230814~230815) (0) 2023.08.14