문제

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

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

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

 

입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

 

출력

첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

 

 

 

풀이

  1. 과목의 개수 N을 입력받고, 

  2. N만큼 과목 수를 입력받은 후 

  3. 최댓값을 구한다.

  4. 새 점수 = 원 점수 / 최댓값 * 100 으로 계산한 후 

  5. 평균을 구하면 끝

여기서 살짝 주춤했던 부분은, 원 점수를 int형으로 입력받았는데, 원점수/최댓값 하면 0.x가 나오는 값의 경우 0 * 100이 돼서

점수가 0점이 된다 (..)

 

그래서 (float)원점수 / 최댓값 * 100 혹은 원점수를 실수형으로 선언해줘야 한다.

 

소스코드

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
import java.util.*;
import java.io.*;
 
public class Main{
    public static void main(String[] args) throws NumberFormatException, IOException {
        Scanner scan = new Scanner(System.in);
        
        int N                 = scan.nextInt();//Integer.parseInt(br.readLine());
        int[] origin_score  = new int[N];
        int M                 = 0;
        float new_avg         = 0;
 
        
        for(int i=0; i<N; i++) {
            origin_score[i] = scan.nextInt();    
            if (origin_score[i] > M) M = origin_score[i];
        }
        
        for (int j=0; j<N; j++) { 
            new_avg += ((float)origin_score[j]/M*100);
        }
        new_avg = new_avg/N;
        
        System.out.println(new_avg);
 
        scan.close();
    }
}
cs
문제

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

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

 

입력

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

 

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

 

 

풀이

아무 생각 없이 나머지는 0-9지! 했다가 틀린(!) 문제

42로 나누면 나머지는 0~41까지 나올 수 있다 ..... 나는 바보다

 

그렇게 나머지 저장 할 배열을 만들어주고, 

각 수를 입력받은 후 나머지 연산 ( num % 42 ) 한 다음 해당 나머지 인덱스에 ++ 해주면 된다!

 

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
import java.io.*;
 
public class Main{
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
        
        int[] remainder = new int[43];
        int num;
        int cnt = 0 ;
        
        for (int i=0; i<10; i++) {
            num = Integer.parseInt(br.readLine());
            remainder[num%42+= 1;
        }
        
        for (int i=0; i<43; i++)
            if(remainder[i] != 0) cnt++;
        
        System.out.println(cnt);
    }
}
cs
문제

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

예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

 

입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.

 

출력

첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

 

 

 

풀이

A, B, C를 입력받아 주고, 곱한 숫자를 변수에 저장한 다음

한 자리씩 떼서(?) 비교하면 된다.

 

  1. 각 자리수별로 올 수 있는 숫자는 0-9이므로, 자리수 빈도를 저장할 배열 (10칸)을 선언해 주고,

  2. 1의 자리수를 하나씩 떼서 해당 값을 인덱스로 갖는 빈도 수 배열(array)의 값을 1 증가시킨다. 

    -> 예를 들어, 123이면 1의 자리수 == 3, array[3] ++;

  3. 그리고 반복문을 돌면서 array 값을 한 줄에 하나씩 출력 (println()) 하면 끝

 

 

소스코드

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
import java.util.*;
import java.io.*;
 
public class Main{
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
        
        int[] cnt_num = new int[10];
        
        int A = Integer.parseInt(br.readLine());
        int B = Integer.parseInt(br.readLine());
        int C = Integer.parseInt(br.readLine());
        
        int number = A*B*C;
        
        while (true) {
            cnt_num[number%10+= 1;
            number = number/10;
            
            if (number < 1break;
        }
        
        for (int i=0; i<10; i++)
            System.out.println(cnt_num[i]);
    }
}
 
cs
문제

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

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

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

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

 

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

 

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

 

 

 

풀이

정수 개수가 9개로 고정되어 있고, 입력은 한 줄에 하나씩 입력받는 문제. 

한 줄에 하나씩이라서 scan.nextInt()를 쓰면 틀리고, readLine()을 사용해서 입력받았다.

 

for문으로 0~9 반복하면서 입력받고,

max값 비교해서 max인 경우 해당 값과, 인덱스값 (0부터 시작했기 때문에 +1 해줘야 한다) 을 저장한다.

 

 

소스코드

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
import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args) throws Exception{
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int[] nums = new int[9];
        int max     = 0;
        int max_idx = 0;
        
        for(int i = 0; i < 9; i++){
            nums[i] = Integer.parseInt(br.readLine());
            
            if(nums[i] > max){
                max = nums[i];
                max_idx=i+1;
            }
        }
        System.out.println(max);
        System.out.println(max_idx);
        
        br.close();
        
    }
}
cs
문제

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

 

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

 

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

 

 

 

풀이

1차원 배열 단계 문제!

JAVA는 처음이라 배열을 어떻게 선언하는지 자세히는 몰랐는데.. 아래와 같이 선언하면 된다고 한다.

 

자료형[] 배열이름 = new 자료형[크기]

 

맨 처음 정수의 개수 N을 입력받아 주고, 

N개의 정수 배열을 선언한 다음 값을 넣었다. // int[] nums  = new int[N];

 

그리고 최소, 최대값 (min, max)을 비교해서 찾아주면 끝

 

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        
        int N        = scan.nextInt();
        int[] nums     = new int[N];
        
        for (int i=0; i<N; i++)
            nums[i] = scan.nextInt();
                
        int max = nums[0], min = nums[0];
        
        for (int i=0; i<N; i++) {
            if (nums[i] > max) max = nums[i];
            if (nums[i] < min) min = nums[i];
        }
        
        System.out.print(min+" "+max);
        
        scan.close();
    }
}
cs

+ Recent posts