알고리즘/브루트포스
[BOJ] 백준 2548 - 대표 자연수 풀이
송승현(SSH)
2023. 1. 20. 00:43
1. 문제
https://www.acmicpc.net/problem/2548
2548번: 대표 자연수
첫째 줄에는 자연수의 개수 N이 입력된다. N은 1 이상 20,000 이하이다. 둘째 줄에는 N개의 자연수가 빈칸을 사이에 두고 입력되며, 이 수들은 모두 1 이상 10,000 이하이다.
www.acmicpc.net
2. 풀이
실버 3에 해당하는 브루트포스 문제이다. 엄청 쉬운 문제였음에도 도대체 왜 삽질을 했는지..... 아직도 한참 부족하다는 것을 또또또 느낀 문제가 아닌가 싶다.
입력으로 주어지는 자연수의 개수 N과 수들을 각각 변수와 리스트에 할당한다.
그 후 차이 값에 해당하는 numList의 인덱스인 i (=대표 자연수 후보)를 저장할 idxList를 만들고, 수들을 저장할 리스트(앞으로 numList라고 명명하겠다.)를 Two-Point로 돌면서 차이 값을 계산한다.
계산한 차이 값이 old 값보다 클 경우 이는 지금까지 들어온 수 보다 가장 작은 값이므로, idxList를 초기화 한 후 i값에 맞는 numList의 값을 idxList에 넣으며, old 값을 방금 계산한 차이 값으로 갱신한다.
이때 왜 idxList를 초기화하는가 의문이 들 수 있다.
결론부터 말하면 차이 값의 최소값을 갖는 인덱스가 바뀐다면 전에 저장해놨던 것은 더 이상 최소 값이 아니기 때문이다.
최소 값이 바뀐다면 그 전에 최소 값이라고 생각하여 List에 넣어놨던 값은 의미가 없어지기에 초기화를 한 후 새로 계산된 최소 값에 해당하는 값을 넣어줘야 하기 때문이다.
3. 소스 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
List<Integer> numList = new ArrayList<>();
for (int i = 0; i < N; i++) {
numList.add(Integer.parseInt(st.nextToken()));
}
List<Integer> idxList = new ArrayList<>();
int old = Integer.MAX_VALUE;
for (int i = 0; i < numList.size(); i++) {
int first = numList.get(i);
int sum = 0;
for (int j = 0; j < numList.size(); j++) {
int second = numList.get(j);
sum += Math.abs(first - second);
}
if (old > sum) {
idxList.clear();
idxList.add(numList.get(i));
old = sum;
} else if (old == sum) {
idxList.add(numList.get(i));
}
}
Collections.sort(idxList);
bw.write(Integer.toString(idxList.get(0)));
bw.flush();
bw.close();
br.close();
}
}