백준 7568번 바로가기

나의 풀이

arr = []

for i in range(n:=int(input())):
  arr.append(tuple(map(int, input().split())))

ans = []
for i in range(n):
  count = 1
  for j in range(n):
    if arr[i][1] < arr[j][1] and arr[i][0] < arr[j][0]:
      count += 1
  ans.append(count)

print(*ans)

고수의 풀이

x,*y=open(0);z=[[*map(int,i.split())]for i in y]
for a,b in z:print(1+sum((a<c)*(b<d)for c,d in z))

출처

CODE REVIEW

  1. 처음에는 정렬해서 문제를 풀어내려 했다. arr.sort(lambda=x:(x[0],x[1])) 그렇지만 다시 원래 순서를 고려해주는것도 귀찮고, 몇 번째로 큰지 결정하는 것에도 은근 신경이 쓰였다.
  2. 그래서 그냥 tuple로 (몸무게,키) 정보를 저장하고 각각에 대해서 순위를 결정해주었다.
    • 문제 조건에서 제시했듯이, 자신보다 (몸무게,키) 모두 큰 사람이 있으면 count+=1해주면 된다.
  3. 고수의 풀이를 보면 for문 2개 설정해서 index로 불러오는 것이 아닌, (a<c)*(b<d)for c,d in z)처럼 리스트에서 바로 불러와서 사용했다. 이게 더 직관적인 것 같기도…?!