본문 바로가기

백준 온라인 저지 (BOJ) 문제풀이

백준 온라인 저지 20943 카카오톡

https://www.acmicpc.net/problem/20943

 

20943번: 카카오톡

카카오톡은 주식회사 카카오가 2010년 3월 18일 서비스를 시작한 글로벌 모바일 인스턴트 메신저로, 2020년 기준 $4\,000$만 명의 사용자가 등록돼 있고 시장 점유율이 $96$%로 사실상 거의 모든 국민

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from sys import *
from math import *
 
 
def nC2(n):
    return n * (n - 1// 2
 
 
users = dict()
= int(stdin.readline())
vertical = 0
 
for i in range(n):
    a, b, c = map(int, stdin.readline().split())
    if b == 0:
        vertical += 1
    else:
        try:
            users[-/ b] += 1
        except KeyError:
            users[-/ b] = 1
            
Sum = nC2(n) - nC2(vertical)
for key in users.keys():
    Sum -= nC2(users[key])
 
print(Sum)
 
cs

 

 

어떤 두 직선의 쌍 중에서 평행하지 않은 쌍의 개수를 구하는 문제라고 보면 된다.

 

그래서 기울기(-a/b)를 key로 하는 딕셔너리를 사용했는데 b=0인 경우, 즉 y축에 평행한 직선인 경우 0으로 나누는

 

오류가 발생해서 vertical이라는 별도의 변수를 이용해서 체크했다.

 

전체 경우는 n개의 직선 중에서 2개를 선택하는 경우라고 할 수 있다.

 

남은 일은 전체 경우에서 각각의 기울기에 해당하는 직선 중에서 2개를 선택하는 경우를 빼주면 된다.

 

솔직히 소수점 연산은 오차가 있어서 틀릴 줄 알았는데 맞아서 신기했다,,, (튜플로 만드는 게 더 정확할 듯)