개발자 Saaad
[JAVA] 백준 4단계 (1차원 배열) 문제 풀이 본문
10807번 개수 세기
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 IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오
// 첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int count = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
// 비교할 정수
int v = Integer.parseInt(br.readLine());
for(int i=0; i< arr.length; i++){
if(arr[i] == v){
count++;
}
}
System.out.println(count);
}
}
- 정수의 개수 N만큼 배열을 새로 생성한 다음, for문을 돌며 각 배열의 인덱스 자리에 값을 할당한다.
- 비교할 정수 v를 입력 받은 다음 배열의 각 인덱스의 값을 for문을 통해 순회하며 같은지 확인하고
같다면 count를 1 증가시킨다.
10871번 X보다 작은 수
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 IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
//정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
// 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
// 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
// X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
StringTokenizer st = new StringTokenizer(br.readLine());
// 배열의 길이
int N = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
// 비교할 정수
int v = Integer.parseInt(st.nextToken());
StringTokenizer input_arr = new StringTokenizer(br.readLine());
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(input_arr.nextToken());
}
for(int i=0; i< arr.length; i++){
if(arr[i] < v){
sb.append(arr[i]).append(" ");
}
}
System.out.print(sb.toString());
}
}
- 정수의 개수 N만큼 배열을 입력받는다
- 비교할 정수 v를 입력 받고 배열을 순회하며 정수 v 와 각 배열의 인덱스에 해당하는 값과 비교한다.
- v 와 비교했을 때, v보다 작다면 StringBuilder 객체 sb에 append() 메소드를 이용하여 sb에 그 값을 담아놓는다.
- print문을 이용해 sb.toString() 을 출력한다.
10818번 최소, 최대
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 IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
//N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
// 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다.
// 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
// 첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
// 배열의 길이 입력 받기
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
// 각 배열에 값을 입력 받기 위해 선언
StringTokenizer st = new StringTokenizer(br.readLine());
// 배열에 값 저장
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int min = arr[0];
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (min > arr[i]) {
min = arr[i];
}
if(max < arr[i]) {
max = arr[i];
}
}
sb.append(min).append(" ").append(max).append("\n");
System.out.print(sb.toString());
}
}
- 정수 N개 만큼의 길이를 가진 배열ㅇ늘 생성한다.
- 최솟값, 최댓값을 각각 min, max라고 정의한다.
- 배열의 길이만큼 for문을 순회하며 min, max를 구한다.
- for문과 변수 할당을 너무 많이해서 메모리를 많이 잡아먹은 것 같다.
2562번 최댓값
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
/*
9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수
3, 29, 38, 12, 57, 74, 40, 85, 61
이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
*/
// 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
// 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
int count = 0;
int max = 0;
for (int i = 1; i <= 9; i++) {
int num = Integer.parseInt(br.readLine());
if (num > max) {
max = num;
count = i;
}
}
System.out.println(max + "\n" + count);
}
}
10810번 공 넣기
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 IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
/*
* 첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
*
* 둘째 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 각 방법은 세 정수 i j k로 이루어져 있으며, i번 바구니부터 j번
* 바구니까지에 k번 번호가 적혀져 있는 공을 넣는다는 뜻이다. 예를 들어, 2 5 6은 2번 바구니부터 5번 바구니까지에 6번 공을 넣는다는
* 뜻이다. (1 ≤ i ≤ j ≤ N, 1 ≤ k ≤ N)
*
* 도현이는 입력으로 주어진 순서대로 공을 넣는다.
*/
// 1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.
// 공이 들어있지 않은 바구니는 0을 출력한다.
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// N개의 원소를 가진 일차원 배열 선언
int [] arr = new int[N];
for (int i = 0; i < M; i++) {
StringTokenizer st2 = new StringTokenizer(br.readLine());
int range1 = Integer.parseInt(st2.nextToken());
int range2 = Integer.parseInt(st2.nextToken());
int ball_number = Integer.parseInt(st2.nextToken());
// range1 ~ range2 바구니에 ball_number 저장
for (int j=range1; j<=range2; j++) {
arr[j-1] = ball_number;
}
}
for (int i=0; i<N; i++) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb.toString());
}
}
- 간단하게 말하자면 1 ~ N 범위를 가진 배열이 있고, 그 안에서 일정 범위(인덱스)를 지정 후 그 범위에 같은 번호를 가진 공을
넣는 예제이다. - 예를 들어 1 5 5 라고 한다면, 범위(1~5) 에 5가 적힌 공을 모두 집어넣는다는 뜻이다.
- M번 반복하는 동안 계속해서 배열 위에 값을 덮어씌우면 된다.
- 배열을 선언하고 for문을 돌며 범위 변수(range1, range2)와 공의 번호(ball_number) 값을 받는다.
- 배열은 인덱스가 0부터 시작하기 때문에 arr[j-1] 위치에 ball_number 를 저장한다.
만약에 1 ~ 5 라고 가정했을 때, 0 ~ 4 인덱스 위치에 저장되어야하기 때문이다. - 마지막 for문에서 배열의 값들을 공백을 가지고 출력하도록 한다.
10813번 공 바꾸기
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 IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
/*
* 첫째 줄에 N (1 ≤ N ≤ 100)과 M C(1 ≤ M ≤ 100)이 주어진다.
*
* 둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에
* 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)
*
* 도현이는 입력으로 주어진 순서대로 공을 교환한다.
*/
// 1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// N개의 원소를 가진 일차원 배열 선언
int[] arr = new int[N];
// 바구니에 적혀있는 번호와 같은 번호로 초기화
for (int i = 0; i < N; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < M; i++) {
StringTokenizer st2 = new StringTokenizer(br.readLine());
int range1 = Integer.parseInt(st2.nextToken());
int range2 = Integer.parseInt(st2.nextToken());
// 값 교환
int temp = arr[range1 - 1];
arr[range1 - 1] = arr[range2 - 1];
arr[range2 - 1] = temp;
}
for (int i = 0; i < N; i++) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb.toString());
}
}
- 지정한 인덱스 두 개간 값을 교환하면 되는 문제이다.
- temp를 이용해 arr[range1-1] 값을 저장해두었다가, arr[range1-1] 에 arr[range2-1] 값을 저장하고, arr[range2-1] 에 temp 값을 저장한다.
- 마지막에 배열의 값들을 공백을 가지고 출력한다.
5597번 과제 안 내신 분..?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
/*
* X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.
교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.
*/
int [] arr = new int [30];
for (int i = 0; i < 28; i++) {
int num = Integer.parseInt(br.readLine());
arr [num - 1] = 1;
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
sb.append(i + 1).append("\n");
}
}
System.out.print(sb.toString());
}
}
- 30개의 원소를 가진 배열 arr을 초기화한다.
- 28명의 학생만 제출했기 때문에 for문을 28번 순회하며 제출한 사람의 출석번호를 입력을 받는다.
그 출석번호에 해당하는 인덱스는 값을 1로 채운다. 배열은 0부터 시작하기 때문에 arr[num-1] 자리에 값을 할당한다 - for문을 arr.length만큼 반복하며 arr[index] 의 값이 0인 곳의 인덱스 값을 StringBuilder 객체 sb에 추가한다.
- 작은값부터 큰값 순서로 출석번호를 출력한다.
3052번 나머지
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
boolean[] arr = new boolean[42];
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i = 0 ; i < 10 ; i++) {
arr[Integer.parseInt(br.readLine()) % 42] = true;
}
int count = 0;
for(boolean value : arr) {
if(value){ // value 가 true 라면
count++;
}
}
System.out.println(count);
}
}
- 앞의 문제와 비슷하게 접근할 수 있다. 42로 나눈 나머지는 0 ~ 41 의 범위를 가지기 때문에 참 거짓 값을 가진
boolean 배열을 선언한다. - 첫번째 for문에서 입력받은 값을 42로 나눈 나머지 값을 인덱스로 하는 곳의 값을 true로 저장한다.
- 정수형 count 를 선언하고, arr의 값들을 순회하며 value가 true라면 count 를 증가시킨다.
- 서로 다른 나머지가 몇개 있는지 출력한다.
10811번 바구니 뒤집기
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 IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
/*
* 첫째 줄에 N (1 ≤ N ≤ 100)과 M C(1 ≤ M ≤ 100)이 주어진다.
*
* 둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에
* 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)
*
* 도현이는 입력으로 주어진 순서대로 공을 교환한다.
*/
// 1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// N개의 원소를 가진 일차원 배열 선언
int[] arr = new int[N];
// 바구니에 적혀있는 번호와 같은 번호로 초기화
for (int i = 0; i < N; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < M; i++) {
StringTokenizer st2 = new StringTokenizer(br.readLine());
int range1 = Integer.parseInt(st2.nextToken());
int range2 = Integer.parseInt(st2.nextToken());
// 시작 인덱스와 끝 인덱스가 1칸씩 이동하며 서로 값을 변경하여
// 역순 정렬
while (range1-1 < range2-1) {
int temp = arr[range1-1];
arr[range1-1] = arr[range2-1];
arr[range2-1] = temp;
range1++;
range2--;
}
}
for (int i = 0; i < N; i++) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb.toString());
}
}
1546번 평균
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 IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
/*
* 세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을
* M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
*
* 예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
*
* 세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
*/
// 첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다.
// 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
// 첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
// 시험 본 과목의 개수 N
int N = Integer.parseInt(br.readLine());
// 과목 개수만큼의 배열
double[] arr = new double[N];
StringTokenizer st = new StringTokenizer(br.readLine());
// 각 성적을 배열에 저장
for (int i = 0; i < N; i++) {
int score = Integer.parseInt(st.nextToken());
arr[i] = score;
}
double max = arr[0];
// 최고 점수 뽑아내기
for (double num : arr) {
if (num > max) {
max = num;
}
}
// 각 점수를 조작
for (int i = 0; i < N; i++) {
arr[i] = (arr[i] / max) * 100;
}
double sum = 0;
for (int i = 0; i < N; i++) {
sum += arr[i];
}
// 평균 출력
System.out.println(sum / N);
}
}
- N개의 과목의 성적을 입력하고, 그 성적들을 조작한 후 성적의 평균을 출력하는 문제이다.
- 최고 점수를 max 변수를 이용해 뽑아낸다.
- 각 점수를 "(기존 점수 / 최고 점수) * 100" 으로 조작한다.
- 조작된 점수를 모두 합한 후 과목의 개수(N)으로 나눈다.
- 소수점이 포함된 연산을 하게 되기 때문에 반드시 !! ! double로 선언하여 문제를 풀어야한다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[JAVA] 백준 6단계 (심화 1) 문제 풀이 (4번까지) (1) | 2025.01.22 |
---|---|
[JAVA] 백준 5단계 (문자열) 문제 풀이 (0) | 2025.01.21 |
[JAVA] 백준 3단계(반복문) 문제 풀이 (0) | 2025.01.15 |
[JAVA] 백준 2단계(조건문) 문제 풀이 (1) | 2025.01.14 |
[JAVA] 백준 1단계(입출력과 사칙연산) 문제 풀이 (0) | 2025.01.14 |