개발자 Saaad

[JAVA] 백준 4단계 (1차원 배열) 문제 풀이 본문

알고리즘 문제풀이/백준

[JAVA] 백준 4단계 (1차원 배열) 문제 풀이

Saaad 2025. 1. 20. 17:02

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로 선언하여 문제를 풀어야한다.