백준/단계별로 풀어보기

백준 - 단계별로 풀어보기 - JAVA (4단계 : 1차원 배열 / 9문제) (2022.12.24 토)

MoveForward 2022. 12. 24. 03:58

1단계 : 10807번 / 개수 세기

총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt(); 
        
        int[] array = new int[n];

        for (int i = 0; i<n; i++){
            array[i] = sc.nextInt();
        }

        int v = sc.nextInt();
        int count = 0;

        for (int i=0; i<n; i++){
            if(array[i] == v){
                count ++;
            }
        }

        System.out.println(count);
    }
}

* 배열 원소를 탐색 -> v와 동일한 값 카운트하기


2단계 : 10871번 / X보다 작은 수

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt(); 
        int x = sc.nextInt();

        int[] A = new int[n];
        for(int i=0; i<n; i++){
            A[i] = sc.nextInt();
        }

        for(int i=0; i<n; i++){
            if(A[i] < x){
                System.out.print(A[i]+" ");
            }
        }
    }
}

* 배열 원소를 탐색 -> x보다 작은값 출력


3단계 : 10818번 / 최소, 최대

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

import java.util.Scanner;

public class Main{
    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();
        }

        int max = A[0]; // 초기값 설정
        int min = A[0]; // 초기값 설정
        for(int i=0; i<n; i++){
            if (A[i] > max){
                max = A[i];
            }

            if (A[i] < min){
                min = A[i];
            }
        }

        System.out.println(min + " " + max);
    }
}

* 배열 탐색 -> 최솟값, 최댓값 비교


4단계 : 2562번 / 최댓값

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        
        int[] A = new int[9];
        for(int i=0; i<9; i++){
            A[i] = sc.nextInt();
        }

        int max = A[0]; // 초기값 설정
        int row = 1;

        for(int i=0; i<9; i++){
            if (A[i] > max){
                max = A[i];
                row = i + 1;
            }
        }

        System.out.println(max);
        System.out.print(row);
    }
}
// 틀린 초기값 설정
int max = A[0];
int row = 0;
// 최댓값이 몇번째 줄인지를 나타내는 변수 row의 초기값을 0으로 한다면,
// 최댓값이 가장먼저 입력되는 경우, row의 최종 출력값이 0이 되게 된다.
/*
입력값
9 8 7 6 5 4 3 2 1
출력값 
9 0
기대값
9 1
*/
// 따라서 아래와 같이 초기값 설정을 변경해야 한다.

// 변경한 초기값 설정
int max = A[0];
int row = 1;

5단계 : 5597번 / 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        
        int[] A = new int[28]; // 제출자 명단
        boolean[] B = new boolean[31]; // 체크 배열 // bboolean 배열의 초기값은 false
        B[0] = true; // 출석번호 0은 없음으로 예외 처리

        for(int i=0; i<28; i++){
            A[i] = sc.nextInt();
            B[A[i]] = true;
        }

        for(int i=0; i<31; i++){
            if (B[i] == false){
                System.out.println(i);
            }
        }
    }
}

* boolean 배열을 활용하여 제출자 출석번호와 동일한 index의 원소를 false => true로 변경

false인 원소의 인덱스만 출력


6단계 : 3052번 / 나머지

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        
        int[] A = new int[10];
        boolean[] B = new boolean[42];

        for(int i=0; i<10; i++){
            int a = sc.nextInt();
            B[a%42] = true;
            
        }

        int count = 0;
        for(int i=0; i<42; i++){
            if (B[i] == true){
                count ++;
            }
        }
        System.out.println(count);
    }
}
// 0~41까지 수의 존재여부를 저장할 배열 생성
boolean[] B = new boolean[42];

// 원소가 true인 것의 갯수를 세어 문제 해결

7단계 : 1546번 / 평균

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        double[] a = new double[n];

        double max = 0;
        for(int i = 0; i<n; i++){
            a[i] = sc.nextDouble();
            if(a[i]>max){max = a[i];}
        }
        double sum = 0;
        for(int i = 0; i<n; i++){
            a[i] = a[i] / max * 100;
            sum += a[i];
        }
        System.out.println(sum / n);
        
    }
}

* 평균 값이 소수점이 나와야 하므로 double 자료형을 사용하는 것


8단계 : 8958번 / OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        String A;

        int score = 0; // 총 점수
        int plus = 1; // 더하는 점수

        sc.nextLine(); // 입력 버퍼를 비워주는 역할
        for (int i=0; i<n; i++){
            A = sc.nextLine();
            char[] B = A.toCharArray();
            for (int j=0; j<B.length; j++){
                if (B[j] == 'O'){score += plus; plus++;}
                else {plus = 1;}
            }
            System.out.println(score);
            score = 0; plus = 1;
        }
    }
}

1. String 자료형 A에 입력받은 문자열을 Char형 배열 B에 한글자씩 넣을 수 있는가 / toCharArray() 함수 사용

2. nextLine() 함수의 "nextLine(엔터키)을 입력하지 않았는데 넘어가는 이유"를 해결할 수 있는가

=> 다른 입력함수와 nextLine() 입력함수 사이에 "sc.nextLine();" 과 같이 의미없는 문장을 넣어 입력 버퍼를 비워주도록 한다.


9단계 : 4344번 / 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

[각 케이스 안에서의 평균 비교 / 케이스 마다 각각의 평균 존재 , 케이스 안에서 몇퍼센트가 평균을 넘는가.]

import java.util.Scanner;

public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        
        int C = sc.nextInt();

        for (int i=0; i<C; i++){
            int N = sc.nextInt();
            int[] score = new int[N];
            int sum = 0;
            for (int j=0; j<N; j++){
                score[j] = sc.nextInt();
                //test
                // System.out.println(score[j]);
                
                sum += score[j];
            }
            double avg = (double) sum/N;
            int count = 0;
            for(int j=0; j<N; j++){
                if(score[j]>avg){count ++;}
                // test
                // System.out.println(score[j]);

            }
            double percent = ((double)count / (double)N)*100;
            // test
            // System.out.println("sum :"+sum+" avg : "+avg+" N :"+ N + " count : "+ count +" percent : "+percent);
            System.out.println(String.format("%.3f", percent) + "%");
        }
    }
}

1. 테스트 케이스 C 속에 각 케이스속 학생의 수 N명의 성적을 배열을 통해 입력 받는다.

2. 학생의 성적을 평균을 구한 후, 학생 성적 배열을 탐색하여 평균보다 높은 학생의 수를 count한다.

3. 출력을 위한 percent 변수 작업 후 String.format() 함수를 사용해 출력 양식에 맞춘다.

 

cf) 형변환 , 소수점 반올림

// int -> double 형 변환
int a = 10;
double b = (double) a;

// 소수점 반올림
String.format(%.3f, a);