Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Tags
more
Archives
Today
Total
관리 메뉴

정리정돈 개발블로그~

[10일차] 국비교육 본문

국비학원 교육 일지

[10일차] 국비교육

snooop 2022. 8. 1. 17:39

[시험데이]

 

 

알고리즘) 평균은 넘겠지?

 

평균은 넘겠지?

[문제]

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

[입력]

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

[출력]

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

[예제입력]

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

[예제출력]

 

40.000%
57.143%
33.333%
66.667%
55.556%

 

 

 

<풀이>

 

package 평균은넘겠지;
// 테스트 케이스 개수가 주어짐
// 각 테스트 케이스에 해당하는 학생 수와 학생우에 대한 성적 입력
// 결과는 평균은 넘은 학생에 대한 %를 출력(소수점 3자리 수까지 출력)


import java.util.Scanner;

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


        // 테스트 케이스를 입력 받기 위한 변수 생성 (스캐너 입력)
        int testCnt = sc.nextInt();
        // 각 테스트 케이스에 대한 결과를 반환 받기 위한 실수형 배열 생성
        double[] result = new double[testCnt];
        // 테스트 케이스에 해당하는 횟수만큼 메소드 호출
        for (int i = 0; i < testCnt; i++) {
            // 테스트케이스 횟수만큼 반복해서 overRate() 호출
            result[i] = overRate();
        }
        // 반환된 결과값을 출력

        for(double e : result){
            System.out.printf("%.3f%%\n", e);
        }

        // 반환된 결과값을 출력


    }
      static double overRate() {
           Scanner sc = new Scanner(System.in);
           // 각 테스트 케이스에 해당하는 학생 수 입력 받기
          int total = 0;//평균을 구하기 위해서 학생의 성적을 합산함
          int overCnt = 0; // 평균을 넘어선 학생 수
          int stCnt = sc.nextInt();
          int [] score = new int[stCnt];
          // 학생의 수 만큼 성적을 입력 받기 위한 배열 생성
          // 반복문을 순회하면서 학생의 수만큼 성적 입력 받기
          for(int i = 0; i< stCnt; i++){
              score[i] = sc.nextInt();
              total += score[i]; // 학생의 성적을 누적함
          }
          double average = (double) total/ stCnt;
          // 평균 구하기
          // 평균을 넘는 학생 수 구하기
          for(int e : score) if(e >  average) overCnt++;
          return (double)overCnt/stCnt*100;
      }

}

출력

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80 
3 70 90 81
9 100 99 98 97 96 95 94 93 91
40.000%
57.143%
33.333%
66.667%
55.556%

 

<알고리즘 : 저항값>

주어진 문제전자 제품에는 저항이 들어간다. 저항은 색 3개를 이용해서 그 저항이 몇 옴인지 나타낸다. 처음 색 2개는 저항의 값이고, 마지막 색은 곱해야 하는 값이다. 저항의 값은 다음 표를 이용해서 구한다.예를 들어, 저항의 색이 yellow, violet, red였다면 저항의 값은 4,700이 된다.첫째 줄에 첫 번째 색, 둘째 줄에 두 번째 색, 셋째 줄에 세 번째 색이 주어진다. 위의 표에 있는 색만 입력으로 주어진다.입력으로 주어진 저항의 저항값을 계산하여 첫째 줄에 출력한다.

 

 

 

 

 

출력

 

orange red white
32000000000

 

 

package 저항;
// 2개의 컬러값을 입력 받음
// 첫번째 입력 10의 자리
// 두번째 입력 1자리
// 세번째 곱하기 값

import java.util.Scanner;

public class resistance {
    public static void main(String[] args){
        // 컬러값에 대한 문자열 배열 선언언
        String[] color ={"black","brown","red", "orange","yellow","green","blue","violet","grey","white"};
        int [] val = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000,1000000000};
        Scanner sc = new Scanner(System.in);
        String fir = sc.next();
        String sec = sc.next();
        String th = sc.next();
        int f =0;
        int s= 0;
        int t =0;
        for(int i = 0; i < color.length; i++){

            if(color[i].equals(fir)) f=i;
            if(color[i].equals(sec)) s=i;
            if(color[i].equals(th)) t=val[i];

        }
        System.out.println((long)(f*10+s*1)*t);


    }
}

 

<알고리즘: 소수의 합 구하기>

package 소수의합구하기;
// 입력 받은 정수보다 작은 소수의 합을 구하는 문제
// 메소드를 이용해서 처리
// 12 : 2 + 3 + 0 + 5 + 0 + 7 + 0 + 0 + 0 + 11 = 28
import java.util.Scanner;

public class sumMain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int sum = -0; // n보다 작은 소수의 합을 구하기 위한 변수
        int n = sc.nextInt(); // n보다 작은 소수의 합을 구하기 위해서 정수 입력 받음
        for (int i = 2; i < n; i++) {
            //1과 자기자신을 제외하기 위한 반복문 범위
            sum += primeFunc(i);// 해당 인덱스가 소수인지 확인
        }
            System.out.println(sum);
    }

    // PrimeSumEx 객체로 생성하지 않고 사용하기 위해서 static 처리
    // 매개변수를 정수로 입력 받아 정수 값을 반환하는 메소드
    static int primeFunc(int n) {
        boolean isPrime = true; // 기본 값을 소수로 설정
        for (int i = 2; i < n; i++) {
              if(n % i == 0) isPrime = false; //1과 자신이외에 나누어 짐
        }
         if(isPrime) return n;
         else return 0;
    }
}

출력

12
28

---> 시간 될때 여러가지 방법으로 풀어보거나 새로운 알고리즘 문제 풀기

 

 

<알고리즘 : 전자레인지>

문제

3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 버튼 A, B, C에 지정된 시간은 각각 5분, 1분, 10초이다.

냉동음식마다 전자레인지로 요리해야할 시간 T가 초단위로 표시되어 있다. 우리는 A, B, C 3개의 버튼을 적절히 눌러서 그 시간의 합이 정확히 T초가 되도록 해야 한다. 단 버튼 A, B, C를 누른 횟수의 합은 항상 최소가 되어야 한다. 이것을 최소버튼 조작이라고 한다.

만일 요리시간이 100초라고 하면(T=100) B를 1번, C는 4번 누르면 된다. 이와 다르게 C를 10번 눌러도 100초가 되지만 이 경우 10번은 최소 횟수가 아니기 때문이 답이 될 수 없다. 이 경우 B 1번, C 4번, 총 5번이 최소버튼 조작이다. 그리고 T=234와 같이 3개의 버튼으로 시간을 정확히 맞출 수 없는 경우도 있다.

여러분은 주어진 요리시간 T초를 맞추기 위한 최소버튼 조작 방법을 구하는 프로그램을 작성해야 한다.

입력

첫 번째 줄에는 요리시간 T(초)가 정수로 주어져 있으며 그 범위는 1 ≤ T ≤ 10,000 이다.

출력

여러분은 T초를 위한 최소버튼 조작의 A B C 횟수를 첫 줄에 차례대로 출력해야 한다. 각각의 횟수 사이에는 빈 칸을 둔다. 해당 버튼을 누르지 않는 경우에는 숫자 0을 출력해야한다. 만일 제시된 3개의 버튼으로 T초를 맞출 수 없으면 음수 -1을 첫 줄에 출력해야 한다.

 

<내가 푼 풀이>

package 전자레인지;

import java.util.Scanner;

public class hourMinSec {
    public static void main(String[] args){

        Scanner sc= new Scanner(System.in);
        int t = sc.nextInt();
        int h = 300;
        int m = 60;
        int s = 10;
        

        if(t % s !=0){
            System.out.println("-1");}


             else{int A = t / h;
                  int B = (t % h) / m;
                  int C = ((t % h) % m) / s;
            System.out.println("A : " + A
                    + " B : " + B + " C : " + C);}



        }

    }

 

<선생님 풀이>

 

package 전자레인지;

import java.util.Scanner;
// 3개의 타이머 : 5분(300), 1분 (60), 10초
//정확한 시간을 맞출 수 없으면 -1 (즉, 10보다 작은 수)
public class hourMinSec {
    public static void main(String[] args){

        Scanner sc= new Scanner(System.in);
        System.out.print("요리시간(초) : ");
        int t = sc.nextInt();
        int a, b, c;

        if(t % 10 !=0){
            System.out.println("-1");}


             else{a = t / 300; // 300으로 나눈 몫
                  b = (t % 300) / 60; // 300보다 작은 값에서 60으로 나눈 몫
                  c = ((t % 300) % 60) / 10;
                  // 300으로 나눈 나머지에서 다시 60으로 나누고 남은 값을 10으로 나눔
            System.out.println("A : " +a
                    + " B : " + b + " C : " + c);}

        }

    }

 

출력

 

요리시간(초) : 120
A : 0 B : 2 C : 0

출력

 

요리시간(초) : 121
-1

 

'국비학원 교육 일지' 카테고리의 다른 글

[12일차] 국비교육  (0) 2022.08.03
[11일차] 국비교육  (0) 2022.08.02
[9일차] 국비교육  (0) 2022.07.29
[8일차] 국비교육  (0) 2022.07.28
[7일차] 국비교육  (0) 2022.07.27