공-부/백준 알고리즘
JAVA. 백준 알고리즘 단계별 문제 - 5단계
사랑짱
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()를 사용하여 소수점 자리수와 입력형식을 지정해주자.