알고리즘/소프티어
[Softeer/Java] 6294. 평균 구하기
ImJay
2024. 4. 30. 13:44
반응형
[Softeer/Java] 6294. 평균 구하기
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
문제 해석
이 문제에서는 학생들의 점수 목록이 주어지고, 주어진 쿼리에 따라 특정 범위의 학생들 점수의 평균을 계산해야 한다. 각 쿼리는 시작 인덱스 𝑠와 종료 인덱스 𝑒를 포함하며, 이 범위에 포함된 학생들의 점수 평균을 출력한다. 문제에서 제공된 코드는 시작 인덱스를 1부터 계산하므로 입력 받을 때 인덱스 조정이 필요하다.
풀이 과정
제공된 코드는 입력 받은 점수 배열과 쿼리를 처리하여 평균을 계산하는 로직을 포함한다. 각 쿼리는 주어진 범위의 점수들을 합산하고, 범위의 길이로 나누어 평균을 구한다. 이 평균은 소수점 둘째 자리까지 출력해야 하므로 String.format을 사용하여 포맷팅한다.
코드
package edu.ssafy.im.SOF.No6294;
import java.io.*;
import java.util.*;
public class Main {
private static int N, K;
private static int[] score;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 학생 수
K = Integer.parseInt(st.nextToken()); // 쿼리 수
score = new int[N];
st = new StringTokenizer(br.readLine()); // 점수 배열 입력
for (int i=0; i<N; i++) {
score[i] = Integer.parseInt(st.nextToken());
}
// 쿼리 처리
for (int i=0; i<K; i++) {
st = new StringTokenizer(br.readLine());
sb.append(sol(Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()))).append("\n");
}
bw.write(sb.toString()); // 결과 출력
bw.flush();
bw.close();
}
// 평균 계산 함수
private static String sol(int s, int e) {
double sum = 0;
for(int i = s; i < e; i++) {
sum += score[i];
}
return String.format("%.2f", sum/(e-s)); // 소수점 둘째 자리까지 평균 출력
}
}
시간 복잡도 분석
이 알고리즘은 각 쿼리마다 점수 배열의 일부를 순회하여 합을 계산하기 때문에, 시간 복잡도는 각 쿼리의 범위 𝑒−𝑠에 비례한다. 최악의 경우 𝑂(𝑁×𝐾)의 시간 복잡도를 가질 수 있다.
느낀점
이 문제를 통해 입력과 출력 처리, 문자열 파싱, 그리고 범위에 따른 평균 계산 방법을 복습할 수 있었다. 실제 코딩 테스트 환경에서는 입력과 출력 처리에 유의해야 하며, 정확하고 효율적인 코드 작성이 중요하다는 것을 다시 한번 인식하게 되었다.
반응형