-
백준 5단계 1차원 배열 - 3052 / 1546 / 89587 / 4344알고리즘/백준 2022. 1. 14. 01:54반응형
백준 3052 : 나머지
문제
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다.
예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다.
그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다.
이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
출력
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
정답
이중 for문을 이용하여 같은 숫자가 있을 경우 count값을 -1 해주었다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main{ public static void main(String[] args) throws NumberFormatException, IOException{ int[] arr = new int[10]; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); for(int i=0; i<arr.length; i++ ) { arr[i] = Integer.parseInt(br.readLine()) % 42; } int count = 10; for (int i = 0; i < arr.length; i++) { for (int j = i+1; j < arr.length; j++) { if(arr[i] == arr[j]) { count--; break; } } } System.out.println(count); } }
위 문제는 배열을 이중 for문을 이용하여 풀었지만 Set 컬렉션을 이용하면 더 간단하게 풀 수 있다.
Set은 기본적으로 중복이 허용이 안되기때문에 중복된 값이 있으면 추가가 안되는 점을 이용한다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; public class Main{ public static void main(String[] args) throws NumberFormatException, IOException{ int[] arr = new int[10]; boolean[] arr_count = new boolean[10]; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Set<Integer> set = new HashSet<Integer>(); for(int i=0; i<arr.length; i++ ) { arr[i] = Integer.parseInt(br.readLine()) % 42; } for (int i = 0; i < arr.length; i++) { set.add(arr[i]); } System.out.println(set.size()); } }
결과화면
- HashSet 사용
- 배열 사용
- 배열 사용
백준 1546 : 평균
문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다.
일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다.
그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다.
둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고,
적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다.
실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
정답
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main{ public static void main(String[] args) throws NumberFormatException, IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] arr = new int[Integer.parseInt(br.readLine())]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); int max = 0; int sum = 0; for (int i = 0; i < arr.length; i++) { arr[i] = Integer.parseInt(st.nextToken()); sum += arr[i]; if(arr[i] > max) max = arr[i]; } System.out.println(((double)sum / max) * 100 / arr.length); } }
사실 배열을 이용하지 않고 for문에서 입력받으면 sum 변수에 더해주고 max 값 찾아주는 로직을 구현하면 간단하다.
이 코드는 너무 쉬운 코드이니 구현안하겠다.
결과화면
백준 1546 : 평균
문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다.
일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다.
그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다.
둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고,
적어도 하나의 값은 0보다 크다.
출력
첫째 줄에 새로운 평균을 출력한다.
실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
정답
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main{ public static void main(String[] args) throws NumberFormatException, IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] arr = new int[Integer.parseInt(br.readLine())]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); int max = 0; int sum = 0; for (int i = 0; i < arr.length; i++) { arr[i] = Integer.parseInt(st.nextToken()); sum += arr[i]; if(arr[i] > max) max = arr[i]; } System.out.println(((double)sum / max) * 100 / arr.length); } }
사실 배열을 이용하지 않고 for문에서 입력받으면 sum 변수에 더해주고 max 값 찾아주는 로직을 구현하면 간단하다.
이 코드는 너무 쉬운 코드이니 구현안하겠다.
결과화면
백준 8958 : OX퀴즈
문제
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다.
문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다.
예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고,
길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.
출력
각 테스트 케이스마다 점수를 출력한다.
정답
3가지 방식으로 했다.
1. System.out.println를 이용
2. BufferedWriter를 이용
3. StirngBuilder를 이용
아래 코드는 StringBuilder를 이용한 코드이다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Main{ public static void main(String[] args) throws NumberFormatException, IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); String[] arr = new String[Integer.parseInt(br.readLine())]; for (int i = 0; i < arr.length; i++) { arr[i] = br.readLine(); } int sum; int count; for (int i = 0; i < arr.length; i++) { count = 0; sum = 0; for (int j = 0; j < arr[i].length(); j++) { if(arr[i].charAt(j) == 'O') count++; else if(arr[i].charAt(j) == 'X') count = 0; sum += count; } sb.append(sum).append('\n'); } System.out.println(sb); } }
배열을 이용하지 않는 방법
byte단위로 입력받은 문자열을 꺼내와 코드를 구현
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int test_case = Integer.parseInt(br.readLine()); // 테스트 케이스 for (int i = 0; i < test_case; i++) { int cnt = 0; // 연속횟수 int sum = 0; // 누적 합산 for (byte value : br.readLine().getBytes()) { if (value == 'O') { cnt++; sum += cnt; } else { cnt = 0; } } sb.append(sum).append('\n'); } System.out.println(sb); } }
결과화면
1. StirngBuilder를 이용
2. BufferedWriter를 이용
3. System.out.println를 이용
결과적으로는 StringBuilder가 제일 빨랐다.
백준 4344 : 평균은 넘겠지
문제
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다.
당신은 그들에게 슬픈 진실을 알려줘야 한다.
입력
첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고,
이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
정답
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws NumberFormatException, IOException { // TODO Auto-generated method stub BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; int C = Integer.parseInt(br.readLine()); int[] arr; double[] rate = new double[C]; for (int i = 0; i < C; i++) { double sum = 0; double avg = 0; int count = 0; st = new StringTokenizer(br.readLine(), " "); int N = Integer.parseInt(st.nextToken()); arr = new int[N]; for (int j = 0; j < arr.length; j++) { arr[j] = Integer.parseInt(st.nextToken()); sum += arr[j]; } avg = sum / N; for (int j = 0; j < arr.length; j++) { if(arr[j] > avg) { count++; } } rate[i] = ((double)count/N)*100; } for (int i = 0; i < rate.length; i++) { System.out.printf("%.3f%%\n", rate[i]); } } }
문제 카테고리가 1차원 배열이므로 1차원 배열로 풀었다
가변길이 2차 배열로도 풀수있을것 같다.
결과화면
반응형'알고리즘 > 백준' 카테고리의 다른 글
백준 5단계 1차원 배열 - 10818 / 2562 / 2577 (0) 2022.01.11 백준 4단계 - 10952 / 10951 / 1110 (0) 2021.12.18 백준 3단계 - 2741 / 2742 / 11021 / 11022 / 2438 / 2439 / 10871 (0) 2021.12.18 백준 3단계 - 2739 / 10950 / 8393 / 15552 / 2741 Java (0) 2021.12.17 백준 단계2 - 1330 / 9498 / 2753 / 14681 / 2884 Java (0) 2021.12.16