문제
A,B 두 사람이 볼링을 치고 있습니다. 두 사람은 서로 무게가 다른 볼링공을 고르려고 합니다. 볼링공은 총 N개가 있으며 각 볼링공마다 무게가 적혀 있고, 공의 번호는 1번부터 순서대로 부여됩니다. 또한 같은 무게의 공이 여러 개 있을 수 있지만, 서로 다른 공으로 간주합니다. 볼링공의 무게는 1부터 M까지의 자연수 형태로 존재합니다.
예를 들어 N이 5이고, M이 3이며 각각의 무게가 차례대로 1,3,2,3,2일 때 각 공의 번호가 차례대로 1번부터 5번까지 부여됩니다. 이때 두 사람이 고를 수 있는 볼링공 번호의 조합을 구하면 다음과 같습니다.
(1번, 2번), (1번, 3번), (1번, 4번), (1번, 5번), (2번, 3번), (2번, 5번), (3번, 4번), (4번, 5번)
결과적으로 두 사람이 공을 고르는 경우의 수는 8가지입니다. N개의 공의 무게가 각각 주어질 때, 두 사람이 볼링공을 고르는 경우의 수를 구하는 프로그램을 작성하세요.
입력 조건
- 첫째 줄에 볼링공의 개수 N, 공의 최대 무게 M이 공백으로 구분되어 각각 자연수 형태로 주어집니다. (1<=N<=1,000 ,1<=M<=10)
- 둘째 줄에 각 볼링공의 무게 K가 공백으로 구분되어 순서대로 자연수 형태로 주어집니다. (1<=K<=M)
출력 조건
- 첫째 줄에 두 사람이 볼링공을 고르는 경우의 수를 출력합니다.
비효율적인 방법
이중 for문 돌리면서 같은 무게가 아닐 경우 result를 1씩 증가시키는 알고리즘이다.
간단하지만 이중 for문을 돌리는 만큼 비효율적이다.
비교를 위해서 작성하였고 바로 효율적인 방법을 고민해보자..
Java 코드
import java.util.*;
public class Main {
public static int n;
public static int m;
public static ArrayList<Integer> arrayList = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 0; i < n; i++) {
arrayList.add(sc.nextInt());
}
int result = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (arrayList.get(i) != arrayList.get(j))
result++;
}
}
System.out.println(result);
}
}
효율적인 방법
책이랑 구현 방식만 약간 다르고 알고리즘 자체는 동일하다.
kg마다 볼링공이 몇 개 있는지 계산 후, 무게가 낮은 볼링공부터 무게가 높은 볼링공까지 확인한다.
무게가 낮은 볼링공부터
'해당 kg 볼링공 개수 * 해당 kg 볼링공보다 무거운 볼링공 개수'
를 누적합하면 된다.
Java 코드
import java.util.*;
public class Main {
public static int n;
public static int m;
public static ArrayList<Integer> arrayList = new ArrayList<>();
public static int count[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
count = new int[m];
for (int i = 0; i < n; i++) {
int num = sc.nextInt();
arrayList.add(num);
count[num-1]++;
}
int result = 0;
int current = n;
for (int i = 0; i < m; i++) {
current -= count[i];
result += count[i] * current;
}
System.out.println(result);
}
}
'Problem Solving > 이코테' 카테고리의 다른 글
[이코테] 구현 - 시각(Java) (0) | 2023.02.02 |
---|---|
[이코테] 구현 - 상하좌우(Java) (1) | 2023.02.02 |
[이코테] 그리디 - 만들 수 없는 금액(Java) (0) | 2023.01.26 |
[이코테] 그리디 - 문자열 뒤집기(Java) (0) | 2023.01.25 |
[이코테] 그리디 - 곱하기 혹은 더하기(Java) (0) | 2023.01.25 |