반응형
250x250
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 |
Tags
- 2022년 정보처리기사 실기 가답안
- 코딩테스트
- 정보처리기사
- 백준 백트랙킹 파이썬
- 백준 N-Queens
- 프로그래머스
- 프로그래머스 파이썬
- it
- 프로그래밍
- dfs
- 토마토
- 자료구조
- 자바
- 알고리즘
- 백준 백트랙킹
- 그리디
- 백준 토마토 파이썬
- 정보처리기사 실기 시험
- 파이썬
- BOJ
- python
- 코드
- BFS
- 2022년 정보처리기사 실기 1회 가답안
- 정보처리기사 실기
- 백준 그래프 이론 파이썬
- 2022년 정보처리기사 실기
- 백준 그래프 탐색 파이썬
- 코딩
- 백준
Archives
- Today
- Total
코딩,안되면 될때까지
[백준 15686번 - 치킨배달]-파이썬 본문
728x90
반응형
solved.ac 난이도 : GOLD5
백준 15686번- 파이썬 풀이 (삼성전자 sw역량테스트)
<문제>
https://www.acmicpc.net/problem/15686
<풀이>-구현,브루트포스 알고리즘
- 이 문제는 경우의 수를 사용하면 어렵지 않게 풀 수 있는 문제다.
- 각 집을 기준으로 거리가 가장가까운 치킨집을 구한후(치킨거리) 그 거리들을 더해주면 된다.(도시의 치킨거리)
- 이때 어떤 치킨집을 선택하느냐에 따라 도시의 치킨거리 값이 달라진다.
- 따라서 모든 경우의 도시의 치킨거리를 구한 후 그 중 최솟값을 구하면 된다.
치킨집을 고르는 경우의 수 : from itertools import combinations를 통해 구한다.
모든 경우의 수에서 도시의 치킨거리를 구하기 위해 삼중반복문을 사용한다.
for candidate in chicken_s:
city_dist =0
for j in range(len(city)):
dist =10000
for x,y in candidate:
dist = min(dist,abs(x-city[j][0])+abs(y-city[j][1]))
city_dist+=dist
ans = min(ans,city_dist)
chicken_s : 어떤 치킨집을 고르는지에 대한 모든 경우의 수가 담겨있는 배열
candidate : 현재 선택된 치킨집의 위치
dist : 각 집의 위치로부터 현재 선택된 치킨집까지의 최소 거리(치킨거리)
city_dist : 각 집에서의 치킨거리를 합한 도시의 치킨거리
ans : 현재 선택된 치킨집에서 나온 도시의 치킨거리, 만약 다른 candidate에서 더 거리가 짧은 값이 나오면 그 값으로 갱신된다.
<코드>-파이썬
from itertools import combinations
n,m = map(int,input().split())
data = []
chicken = []
city = []
for _ in range(n):
data.append(list(map(int,input().split())))
for i in range(n):
for j in range(n):
if data[i][j] == 1:
city.append((i,j))
if data[i][j] == 2:
chicken.append((i,j))
ans = 10000
chicken_s = list(combinations(chicken,m))
for candidate in chicken_s:
city_dist =0
for j in range(len(city)):
dist =10000
for x,y in candidate:
dist = min(dist,abs(x-city[j][0])+abs(y-city[j][1]))
city_dist+=dist
ans = min(ans,city_dist)
print(ans)
-마치며-
문제의 해결아이디어를 떠올리는데는 큰 어려움이 없었다. 하지만 그 아이디어를 코드로 구현하는데 약갼의 어렴을 겪었다.
필자는 반복문을 작성할때
for x,y in candidate를 먼저 쓰고 for j in range(len(city))를 마지막에 작성했다.
하지만 이렇게 치킨집이 기준이 될경우
치킨집과 집의 치킨거리보다 더 짧은 거리를 갖는 치킨집을 배제하기 때문에 문제를 틀리게 된다.
따라서 반복문을 작성할때 무엇이 기준인지를 확실하게 이해해야 한다.
728x90
반응형
'백준 > 백준-파이썬' 카테고리의 다른 글
[백준 11866번-요세푸스 문제 0]-파이썬 (4) | 2022.03.21 |
---|---|
[백준 1107번-리모컨]-파이썬 (6) | 2022.03.20 |
[백준 1966번 - 프린터 큐]-파이썬 (0) | 2022.03.18 |
[백준 1018번-체스판 다시 칠하기]-파이썬 (6) | 2022.03.17 |
[백준 14499번 - 주사위 굴리기]-파이썬 (18) | 2022.03.16 |
Comments