상세 컨텐츠

본문 제목

JAVA. 백준 알고리즘 단계별 문제 - 5단계

공-부/백준 알고리즘

by 사랑짱 2021. 5. 26. 23:23

본문

(문제 번호 10818)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Arrays;
import java.util.Scanner;


public class No01 {


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

       do {
        System.out.print("정수의 개수 : ");
        n = sc.nextInt();    
       } while(n < 0);    

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

        System.out.println("최소값 : " + arr[0]);
        System.out.println("최대값 : " + arr[n-1]);    
        
        sc.close();

   } //main

} //class
cs

\

인덱스가 필요하지 않은 최소값, 최대값을 구할 때는 Arrays.sort()을 이용하면 간편하다.

Arrays.sort() 를 이용하여 정렬한 뒤 인덱스의 맨앞과 맨뒤에 값을 구하면 된다.

 

 


 

 

(문제 번호 2562)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Scanner;


public class No02 {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);        
        int[] arr = new int[9];     // 배열 선언

        for(int i = 0; i < 9; i++) { //배열에 정수 대입
            arr[i] = sc.nextInt();
        }
       sc.close();
        
        int max = arr[0];
        int index = 1;

        for(int i = 0; i < 9; i++) {             
            if(arr[i] > max) {
                max = arr[i];
                index = i+1;
            }
        }  
      
        System.out.println(max);
        System.out.println(index);

   } //main

} //class
cs

 

5-1번 문제와 달리 인덱스가 필요한 문제이기 때문에 인덱스에 이동이 있으면 안된다.

그렇기 때문에 for문 내 조건문을 통해 max 변수에 최대값을 대입해야 한다.

또한 인덱스의 값과 서수(~번째)는 다르기 때문에 i+1을 해줘야 한다.

 

 


 

 

(문제 번호 2577)

5-3. 세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.Scanner;


public class No03 {


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

        int a = sc.nextInt();    
        int b = sc.nextInt();
        int c = sc.nextInt();        

        sc.close();
        
        int[] count = new int[10];
        int result = a*b*c;    

        while(result > 0) {
            count[result%10]++;
            result /= 10;
        }        

        for(int i : count) {
            System.out.println(i);
       }       

   } //main

} //class
cs

 

A × B × C 결과값에  쓰인 숫자, 그리고  각 숫자의 횟수를 알아내야 한다.

이에 각 숫자의 횟수를 배열에 입력하기 위해 0부터 9까지, 10 길이의 배열을 선언한다.

쉽게 말해 "Index번호 = 결과값에 쓰인 숫자 " 인 셈이다.

또한 배열을 선언만 했기 때문에 int 타입의 초기값인 0이 된다. 

 

이제 %(나머지) 연산으로 1의 자리를 구하여 횟수를 늘려  각 Index의 값으로 결과를 도출하면 된다.

 

 


 

 

(문제 번호 3052)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Scanner;


public class No04 {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("정수입력 ");
        
        int[] arr = new int[42];        
        int n;

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

        int count = 0;

        for(int i = 0; i < 42; i++) {
            if(arr[i] != 0) {
                count++;
            }
        }
        System.out.println(count);            
        sc.close();

   } //main

} //class
cs

 

5-3번과  비슷한 형태로 42로 나눈 나머지의 값을

Index로 가정하여 배열값을 받았다.

따라서 배열의 길이는 0~41로 42가된다.

 


 

 

(문제 번호 1546)

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

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Scanner;


public class No05 {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("과목수 : ");

        int n = sc.nextInt();
        int[] arr = new int[n];    //n만큼 배열 선언        
      int M = arr[0];

        for(int i = 0; i < n; i++) {
            int score = sc.nextInt();
            
            if(0 < score && score <= 100) {
                arr[i] = score;     //점수 조건 충족 시 배열에 입력
            }
            if(arr[i] > M) {
                M = arr[i];        //점수의 최대값
            }
        }    
    
        double sum = 0;

        for(int i = 0; i < n; i++) {
            sum += (double)arr[i]/M*100;    //평균출력
        }        

        System.out.println(sum/n);        
        sc.close();

   } //main

} //class
cs

 

먼저 학생들의 점수를 받기 위한 배열을 선언하여 배열의 최대값을 구한 뒤 평균을 출력한다.

이 때 평균값은 실수이나 배열의 타입은 int이므로 묵시적형변환을 해야 한다.

 

 


 

 

(문제 번호 8958)

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Scanner;


public class No06 {


    public static void main(String[] args) {
        System.out.println("OX를 입력하시오.");
 
        Scanner sc = new Scanner(System.in);
        String ox = sc.nextLine();
        String[] arr = new String[ox.length()]; //ox길이만큼 배열선언하기

        sc.close();
        
        for(int i = 0; i < ox.length(); i++) {
            arr[i] = ox.substring(i,i+1);    // o,x를 배열에 입력하기            
        }
        
        int score = 0;    // 점수
        int count = 0;    // 'O'가 연속되는 횟수

        for(int i = 0; i < ox.length(); i++) {
 
            if(arr[i].equals("o")||arr[i].equals("O")) {
                count++;
            }
            else if(arr[i].equals("X"||arr[i].equals("x")) {
                score += count*(count+1)/2;
                count = 0;    // count 초기화
            }
        }
        
        if(count > 0) {    // O으로 끝나는 점수 처리
            score += count*(count+1)/2;
        }

        System.out.println("점수 :  " + score);

   } //main

} //class
cs

 

입력받은 OX 결과 값을 배열에 입력한다.

이후 O가 연속되는 횟수에 따라  X가 나오면 가오스공식으로 횟수만큼 점수를 더하고 

O이 연속으로 나온 횟수는 초기화한다.

이 과정에서 O로 끝나는 결과값의 경우 점수가 누락될 수 있어 남은 count 값을 처리해야한다.

 

 


 

 

(문제 번호 4344)

5-7. 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

import java.util.Scanner;


public class No07 {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while(true) {
            System.out.print("학생수 : ");

            int n = sc.nextInt();    //학생수 입력받기            
            int[] score = new int[n];    //학생수만큼 배열선언            
            int sum = 0//점수합계

            for(int i = 0; i < n; i++) {
                score[i] = sc.nextInt();    //학생들 점수 입력        
                sum += score[i];            //학생들 점수 합계 
            }

            int avr = sum/n;  //평균
            int count = 0;      //평균 넘는 학생수

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

            double result = (double)count/n*100;    // 평균 넘는 학생 비율
            System.out.println(String.format("%.3f", result));
       }

   } //main

} //class
 
cs

 

학생들의 평균점수를 구하고 학생 비율을 구한다. 

이때 소수점을 반올림하기 위해 String.format()를 사용한다.

String.format()를 사용하여 소수점 자리수와 입력형식을 지정해주자.

 

 

 

관련글 더보기