Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Problem set 2.7
- 공업수학
- SW역량테스트
- 공수
- 미분방정식
- 삼성SW역량테스트
- 영어회화
- Advanced Engineering Mathematics
- 공수 문제풀이
- 비제차 상미분 방정식
- Problem Set 1.4
- Python
- Homogeneous ODEs
- 공학수학
- Nonhomogeneous ODEs
- English
- Conversation
- ODEs
- 대학
- Problem set 1.5
- 공수1
- homogeneous
- 미방
- 백준
- 문제풀이
- vocabulary
- 맛집
- 코딩테스트
- kreyszig
- Ode
Archives
- Today
- Total
한걸음
백준 15686 : 치킨 배달(파이썬) 본문
반응형
https://www.acmicpc.net/problem/15686
오랜만에 가벼운 마음으로 풀 수 있는 문제를 만났다.
아직은 DFS 가 익숙하지 않아서.. 재귀함수로 접근하는 것이 어렵다.
그래서 치킨집의 개수 T와 폐업시키고 남길 치킨 집 수 M을 활용하여 조합 함수를 작성하였다.
itertools를 이용하면 더욱 쉽게 접근이 가능한 문제이지만, itertools를 활용하지 않고 조합 함수를 만들어서 썼다.
1. 조합 함수
재귀함수 형태로 만들면 조합수 추출이 가능하다. 이해가 안되면 외우자. 순열은 언제 외우냐...
def gen_combination(arr, t) :
result = []
if t == 0 :
return [[]]
for i in range(len(arr)) :
elem = arr[i]
rest_arr = arr[i+1 : ]
for C in gen_combination(rest_arr, t - 1) :
result.append([elem] + C)
return result
2. 0은 빈 공간, 1은 집, 2는 치킨 집
2번째 줄부터 좌표정보를 받아올 때 반복문을 이용하여 좌표 정보를 추출하였다.
어차피 거리 계산하게 되므로, 좌표가 1부터 시작한다는 것은 딱히 신경안써도 된다.
for i in range(n) :
info = list(map(int, input().split()))
for j in range(len(info)) :
if info[j] == 1 : h_list.append([i, j])
if info[j] == 2 : c_list.append([i, j])
3. 전체 코드
128144 KB 240 ms
n,m = map(int, input().split())
h_list, c_list = [], []
minValue = 1e9
for i in range(n) :
info = list(map(int, input().split()))
for j in range(len(info)) :
if info[j] == 1 : h_list.append([i, j])
if info[j] == 2 : c_list.append([i, j])
def gen_combination(arr, t) :
result = []
if t == 0 :
return [[]]
for i in range(len(arr)) :
elem = arr[i]
rest_arr = arr[i+1 : ]
for C in gen_combination(rest_arr, t - 1) :
result.append([elem] + C)
return result
c_comb = gen_combination(c_list, m)
def solve() :
global minValue
for i in range(len(c_comb)) :
result = 0
for j in range(len(h_list)) :
dist = []
for k in range(m) :
dist.append(abs(c_comb[i][k][0] - h_list[j][0]) + abs(c_comb[i][k][1] - h_list[j][1]))
result += min(dist)
minValue = min(result, minValue)
solve()
print(minValue)
반응형
'Coding Test' 카테고리의 다른 글
백준 16234 : 인구 이동(파이썬) (0) | 2023.10.26 |
---|---|
백준 5373 : 큐빙(파이썬) (1) | 2023.10.26 |
백준 15685 : 드래곤 커브(파이썬) (1) | 2022.11.09 |
백준 단계별로 풀어보기 (5) : 함수 (0) | 2022.11.05 |
백준 1260 : DFS와 BFS (파이썬) (1) | 2022.11.05 |