https://swexpertacademy.com/main/solvingProblem/solvingProblem.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이를 하면서, 문제를 푸는 것 외에 확장된 생각을 함께 정리한다.
문제를 푸는 흐름은
1. 최댓값, 최솟값을 구한다.
2. 배열의 원소들의 총 합에서 최댓값, 최솟값을 빼준다.
3. 뺀 결과를 8(전체 원소 개수 - 최댓값 1개 - 최솟값 1개)
라고 생각을 했고,
출력을 위해서
1. int를 double로 형변환하기 위해 8로 나누는 것이 아닌 8.0(8.0은 double, 8.0f는 float이므로)으로 나눠줬다.
2. 소수점 첫째자리에서 반올림 하기 위해, 반올림 하기 위한 변수에 0.5를 더하고 int로 형변환하여 버림을 해줬다.
(예를 들어, 13.4라면 0.5를 더해 13.9가 되고, int형변환을 통해 13이 되지만,
13.5라면 0.5를 더해 14.0이 되고, int형변환을 통해 14가 되기 때문이다.)
그 Solution은 다음과 같다.
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 Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int n = 1; n <= T; n++) {
int[] arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = sc.nextInt();
}
// 최댓값 max 구하기
int max = arr[0];
for (int i = 0; i < 10; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 최솟값 min 구하기
int min = arr[0];
for (int i = 0; i < 10; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
// 배열 원소 전체 합 구하기
int sum = 0;
for (int i = 0; i < 10; i++) {
sum = sum + arr[i];
}
int sum1 = sum - max - min;
double ave = sum1 / 8.0; //int를 double로 형변환
// 소수 첫째자리에서 반올림을 하기 위해 0.5를 더하고 int로 형변환
System.out.println("#" + n + " " + (int) (ave + 0.5));
}
}
}
|
cs |
하지만,
위의 생각에서 좀 더 자세히 파고들면,
최댓값과 최솟값을 각각 1개씩만 가지는 배열만 input 데이터에 포함되어 있다는 확신이 있는가? 라는 생각이 들게 된다.
즉, 어떤 배열이 {1,2,3,4,5,6}여서 최댓값이 6, 최솟값이 1이라고 했을 때, 위와 같은 Solution대로 결과를 출력할 수 있지만,
어떤 배열이 {1,1,2,3,4,5,6,6}이라면 최댓값, 최솟값이 2개씩 존재하게 되므로 단순히 전체 배열 원소의 개수에서 2를 빼준 값을 통해 평균을 구하려고 접근해서는 안된다.
따라서, 아래 Solution은 최댓값, 최솟값이 중복해서 존재하는 경우 그 개수를 고려해준 결과이다.
위, 아래 둘다 동일한 출력 결과가 나타나지만, 이것은 input 데이터가 중복된 최댓값 혹은 최솟값이 존재하지 않았기 때문이었을 뿐이다.
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int n = 1; n <= T; n++) {
int[] arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = sc.nextInt();
}
// 최댓값 max 구하기
int max = arr[0];
for (int i = 0; i < 10; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 최솟값 min 구하기
int min = arr[0];
for (int i = 0; i < 10; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
// 배열 원소 전체 합 구하기
int sum = 0;
for (int i = 0; i < 10; i++) {
sum = sum + arr[i];
}
// 최댓값, 최솟값이 몇개씩 들어있는지 확인
// 각각 1개씩 있다면 전체 원소 10개에서 최댓값, 최솟값 1개씩 뺀 8개에 대해 평균값을 구하면 되지만,
// 1 1 2 3 4 5 5처럼 최댓값, 최솟값이 1개보다 많다면 그 개수만큼 더 빼줘야 하기 때문이다.
int maxCount = 0, minCount = 0;
for (int i = 0; i < arr.length; i++) {
if (max > arr[i]) {
maxCount++;
}
if (min < arr[i]) {
minCount++;
}
}
// 10 - maxCount는 최댓값의 개수, 10 - minCount는 최솟값의 개수
int sum1 = sum - max * (10 - maxCount) - min * (10 - minCount);
int count = 10 - (10 - maxCount) - (10 - minCount);
double ave = sum1 / (double) count;
// 소수 첫째자리에서 반올림을 하기 위해 0.5를 더하고 int로 형변환
System.out.println("#" + n + " " + (int) (ave + 0.5));
}
}
}
|
cs |
'알고리즘 및 코테 > SWEA' 카테고리의 다른 글
SWEA 2805. 농작물 수확하기(Java) (0) | 2023.01.12 |
---|---|
SWEA 1954. 달팽이 숫자(Java) (0) | 2023.01.12 |
SWEA 1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기 - Java (0) | 2023.01.10 |
SWEA 1966. 숫자를 정렬하자(Java) (2) | 2023.01.10 |
SWEA 2068. 최대수 구하기 및 최댓/최솟값 구하기(Java) (0) | 2023.01.09 |