| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 | 30 | 31 |
Tags
- 네트워크 관리사 2급
- 백준
- 신문스크랩
- 프로그래머스
- 네트워크 관리사 2급 실기
- SSAFYcial
- 카카오
- SSAFY 7기
- KT
- IT 동향
- html
- 백준위
- it 뉴스
- 리얼클래스
- java 객체지향 프로그래밍
- python
- Java
- SSAFY
- 인앱결제
- 싸피
- IT 트렌드
- 코테
- 구글
- it 이슈
- 싸피셜
- 네트워크 관리사
- 코딩테스트 연습
- 우테코
- 신문 스크랩
- 코딩테스트
Archives
- Today
- Total
개발자일걸요..?
14889번 스타트와 링크 본문
728x90
반응형
문제 링크 : www.acmicpc.net/problem/14889
14889번: 스타트와 링크
예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다.
www.acmicpc.net

내 코드의 알고리즘
1) 인원 수 N이 N/2로 나누어질 수 있는 경우 구하기(같은 수 반복, 같은 경우 중복 없이)
2) 1)과정으로 구한 경우 list 중 반은 start팀으로 남은 반은 link팀으로 구분
-> 이때 팀 구분 순서중요 : start팀은 1)경우의 앞에서부터 / link팀은 1)경우의 뒤에서부터
ex) 1)의 결과가 [0,1], [0,2], [0,3], [1,2], [1,3], [2,3] 이라면
start팀 : [0,1], [0,2], [0,3]
link 팀 : [2,3], [1,3], [1,2]
3) 각 팀의 멤버들의 capacity 총합 구하기
-> 한 팀의 멤버수를 고려해서 이중 for문 필요 & 팀의 경우의 수만큼 반복 필요
4) 두 팀의 모든 경우에서의 capacity를 구했다면 경우별 capacity의 차이가 가장 작은 경우 찾기
-> 이때 어느 팀이 더 큰지는 중요하지 않으므로 abs()를 사용해 절대값으로 구하기
visited = [False for _ in range(21)]
arr = [ -1 for _ in range(21)]
memberList = []
def memberCheck(now:int, N):
global visited
global arr
global memberList
if(now==(N/2+1)):
team1 = []
for i in range(1,now):
team1.append(arr[i])
memberList.append(team1)
else:
for i in range(0,N):
if(visited[i]==True):
continue
else:
if(i>arr[now-1]):
arr[now] = i
visited[i] = True
memberCheck(now+1,N)
visited[i] = False
import sys
# 총 인원수
N = int(sys.stdin.readline())
# 사람 별 능력치 입력받기
peopleCapa = []
for _ in range(N):
peopleCapa.append(list(map(int, sys.stdin.readline().split())))
# 팀 나눌 수 있는 경우 나열
memberCheck(1,N)
# 두팀으로 나누기
caseCount = int(len(memberList) / 2)
startT = []
linkT =[]
for i in range(0,caseCount):
startT.append(memberList[i])
linkT.append(memberList[(len(memberList)-1)-i])
#팀별 capa합 구하기
memberCapaCalcul = [[0 for _ in range(2)]for _ in range(caseCount)]
for k in range(0,caseCount):
for i in range(0,int(N/2)):
for j in range(0,int(N/2)):
memberCapaCalcul[k][0]+=peopleCapa[(startT[k])[i]][(startT[k])[j]]
memberCapaCalcul[k][1] += peopleCapa[(linkT[k])[i]][(linkT[k])[j]]
#팀별 capa차이가 가장 작은 경우 구하기
minimum = 1000
for i in range(0,caseCount):
capaG = abs(memberCapaCalcul[i][1]-memberCapaCalcul[i][0])
if(minimum>capaG):
minimum = capaG
print(minimum)반응형
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
| 2609번 최대공약수와 최소공배수 (0) | 2021.02.12 |
|---|---|
| 5086번 배수와 약수 (0) | 2021.02.11 |
| 1003번 피보나치 함수 (0) | 2021.02.08 |
| 15652번 N과 M(4) (0) | 2021.02.06 |
| 15651번 N과 M(3) (0) | 2021.02.06 |
Comments