SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
사실 문제 자체는 그렇게 어렵지 않다. D1 문제이기도 하고 그냥 Arrays.sort(배열) 넣고 배열의 N/2번째 원소가 정답이 되는 식인데 다른 접근법을 배워 정리할 겸 포스팅을 한다.
코드는 다음과 같다
import java.util.Scanner;
public class 중간값찾기 {
static int[] num; //
static int sum, ans;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
num = new int[N];
for (int i = 0; i < N; i++) {
num[sc.nextInt()]++;
}
sum = 0;
ans = 0;
for (int i = 0; i < N; i++) {
sum += num[i];
if(sum > N / 2) {
ans = i;
break;
}
}
System.out.println(ans);
}
}
-새로운 접근법-
이 접근법의 핵심은 우선 빈도수를 센다 그래서 input으로 1이 1번, 2가 5번, 3이 1번, 4가 1번, 5가 1번, 6이 1번 나왔다고 해보자. 중간값은 2가 될 것이다. 그럼 sum이라는 변수를 생성하여 sum+= 1번째 인덱스의 수를 더한다. 그러니까 sum 변수는 1이 몇번 나왔나가 된다. 그리고 이 sum을 2/n와 비교하여 크다면 정답을 i로 잡고 아니라면 2번 인덱스로 간다. 2번 인덱스의 값과 sum의 값을 더하면 6이 되겠다. sum은 1과 2가 나온 횟수를 센 변수이다. 그러니까 1과 2가 나온 횟수를 합하면 총 6번이라는 얘기다. 2/n와 비교한다. 2/n 보다 크다. 그러니까 중간값은 2가 된다.
이게 처음 들었을 떄는 뭔소린가 싶은데 계속 생각하다보면 이해가 된다. 그러니까 정렬해서 푸는 방법은 배열을 정렬한 뒤 0부터 2/n 까지 하나하나 세면서 가는거고 저거는 1 몇번 나왔고 2 몇번 나왔고 ... i번 몇번 나왔고 이걸 다 더해주다가 어? 2/n 넘었네? 그럼 i번째가 중간값이구나 하게 되는거다. 정렬된 배열을 나온 수대로 더하며 건너뛴다고 생각하면 되려나?
느낀 점: 접근법은 굉장히 다양하고 블로그 포스팅은 어려우며 아이패드 사고싶다.
'알고리즘 문제 풀이' 카테고리의 다른 글
백준 1065 한수 (Java 자바) (0) | 2021.02.08 |
---|---|
SWEA 퍼펙트 셔플 (0) | 2021.02.05 |
SWEA 1225 암호 생성기 (0) | 2021.02.04 |
백준2164 카드2 (0) | 2021.02.04 |
SWEA 괄호 짝짓기 (0) | 2021.02.04 |