정리정돈 개발블로그~
[10일차] 국비교육 본문
[시험데이]
알고리즘) 평균은 넘겠지?
평균은 넘겠지?
[문제]
대학생 새내기들의 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 |