문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
솔루션
- 특정 선수가 어떤 선수를 이겼는지 알기 위해선 그 선수와 관련 된 모든 경우를 찾아봐야함.
- 플루이드 워셜 알고리즘은 최단거리를 구하는 알고리즘이지만 어떤 노드(모든)에서부터 다른 모든 노드까지의 경우의 수를 다 구할 수 있음. 이 점을 활용해서 문제를 풀어본다.
- 예를 들어 1>2>3>4 일 때, 1번이 4번을 확실히 알기 위해선 (1,3) (3,4)를 통해 알 수 있음.
- 이것을 코드화 하면 아래와 같음
for k in range(1, n+1):
for i in range(1, n+1):
for j in range(1, n+1):
if gr[i][j] == 0 and gr[i][k] and gr[k][j]:
gr[i][j] = 1
- 이후 해당 선수의 순위가 정확히 판단 가능한지는 col_sum[i]+row_sum[i] == (n-1) 인 경우로 알 수 있음
코드
# result[a,b] : a는 b를 이겼다
def solution(n, results):
answer = 0 # 정확하게 순위를 매길 수 있는 선수의 수
gr = [[0]*(n+1) for i in range(n+1)]
for winner, loser in results:
gr[winner][loser] = 1
for k in range(1, n+1):
for i in range(1, n+1):
for j in range(1, n+1):
if gr[i][j] == 0 and gr[i][k] and gr[k][j]:
gr[i][j] = 1
col_sum = [0]*(n+1)
row_sum = [0]*(n+1)
for i in range(1, n+1):
for j in range(1, n+1):
col_sum[j] += gr[i][j]
row_sum[i] += gr[i][j]
for i in range(n+1):
if (col_sum[i]+row_sum[i] == (n-1)):
answer += 1
return answer
print(solution(5, [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]))
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
셔틀버스 (파이썬) (1) | 2023.10.09 |
---|---|
연속 펄스 부분 수열의 합 (0) | 2023.10.06 |
[DFS/BFS] 아이템 줍기 (파이썬) - 진행 중 (1) | 2023.06.13 |
[카카오] 블록 이동하기 ( 파이썬 ) (0) | 2023.06.10 |
[연습 문제] 숫자 타자 대회 ( 파이썬 ) (0) | 2023.06.06 |