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)
# 내가 푼 코드(2중 for문을 사용)
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
data = list(map(int, input().split()))
cnt = 0
for a in range(len(data)):
for b in range(a + 1, len(data)):
if data[a] == data[b]:
continue
cnt += 1
print(cnt)
# 저자의 코드
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
frequency = [0] * 11
data = list(map(int, input().split()))
for x in data:
frequency[x] += 1
result = 0
for i in range(N):
N -= frequency[i]
result += frequency[i] * N
print(result)
알고리즘 유형 : Greedy
볼링공의 개수는 최대 1,000개로 2중 for문을 돌렸을 때, 최대 1,000,000이 된다.
그렇기에 이전 요소를 고려하지 않고 for문을 돌렸을 때, 1,000,000보다는 무조건 작은 값이 나올 것이라고 생각해서 2중 for문으로 문제를 해결했다.
깃허브 소스코드의 경우 볼링공 무게별로 배열에 저장한 후 한 사람이 해당 무게의 공을 고르면 그 무게의 볼링공 갯수를 전체 갯수에서 차감하여 곱해주고 계속 더해나가면 되는 방식을 사용했다.
이것이 코딩테스트다 with 파이썬 - 볼링공 고르기
모범 답안 - 볼링공 고르기