안녕하세요 성조입니다.
이 포스팅은 Python 3 버전을 기준으로 풀이됐습니다.
문제 출처
https://www.acmicpc.net/problem/14467
14467번: 소가 길을 건너간 이유 1
3번 소는 위치 1, 0, 1에서 관찰되었으므로 길을 최소 두 번 건넜음을 확인할 수 있다. 4번 소도 길을 한 번 건넜으며, 나머지 소는 길을 건넌 기록이 확인되지 않는다.
www.acmicpc.net
문제
닭이 길을 건너간 이유는 과학적으로 깊게 연구가 되어 있지만, 의외로 소가 길을 건너간 이유는 거의 연구된 적이 없다. 이 주제에 관심을 가지고 있었던 농부 존은 한 대학으로부터 소가 길을 건너는 이유에 대한 연구 제의를 받게 되었다.
존이 할 일은 소가 길을 건너는 것을 관찰하는 것이다. 존은 소의 위치를 N번 관찰하는데, 각 관찰은 소의 번호와 소의 위치 하나씩으로 이루어져 있다. 존은 소를 10마리 가지고 있으므로 소의 번호는 1 이상 10 이하의 정수고, 소의 위치는 길의 왼쪽과 오른쪽을 의미하는 0과 1 중 하나다.
이 관찰 기록을 가지고 소가 최소 몇 번 길을 건넜는지 알아보자. 즉 같은 번호의 소가 위치를 바꾼 것이 몇 번인지 세면 된다.
입력
첫 줄에 관찰 횟수 N이 주어진다. N은 100 이하의 양의 정수이다. 다음 N 줄에는 한 줄에 하나씩 관찰 결과가 주어진다. 관찰 결과는 소의 번호와 위치(0 또는 1)로 이루어져 있다.
출력
첫 줄에 소가 길을 건너간 최소 횟수를 출력한다.
코드
N = int(input())
locations = []
cnt = 0
for _ in range(N):
cow, loc = map(int, input().split())
if cow > len(locations):
locations.extend([[] for _ in range(cow - len(locations))])
locations[cow-1].append(loc)
for locs in locations:
prev_loc = None
for loc in locs:
if prev_loc != None and prev_loc != loc:
cnt += 1
prev_loc = loc
print(cnt)
풀이
[문제 접근]
1. 첫 줄에 관찰 횟수 N을 입력 받을 수 있도록 구현한다.
2. 좌측(소)가 우측(길)의 값들을 입력받는 코드를 구현한다.
3. 예제 첫줄에 3번의 소의 우측 값이 1인데 다음 줄 코드를 보면 3 0의 값을 가진다. 이때 소는 길을 건넌 것으로 판단하고 1을 카운팅 하면 된다.
[코드 정리]
1. N번 반복하는 값을 입력받아 위치 리스트에 저장한다.
2. 만약 입력된 소의 값이 빈 리스트의 값보다 큰 경우 빈 리스트 None을 추가하여 해당 인덱스에 값을 저장받을 수 있도록 초기화한다.
locations.extend([[] for _ in range(cow - len(locations))])
extend는 리스트를 확장할 때 활용한다. 또한 for문은 cow의 인덱스가 생성되고 각각의 인덱스는 빈 리스트로 초기화 하게 된다.
3. 소와 위치를 입력 받는다.
4. 각각의 소가 움직였는지 위치 값을 비교한다. 위치가 이전 위치와 다르거나 없는 경우 카운팅 아닌 경우 이전 위치를 저장하고 다음 위치로 넘어가서 비교한다.
올바르지 못한 내용이나 궁금한 내용이 있다면 언제든지 댓글로 지식을 얘기해 주시면 감사드리겠습니다.
더 좋은 포스팅 작성할 수 있도록 노력해 보겠습니다.
다음 포스팅 때 뵙겠습니다.
'백준 - Python' 카테고리의 다른 글
[백준 - 3273][Python] 두 수의 합 (0) | 2023.03.07 |
---|---|
[백준 - 1789][Python] 수들의 합 (0) | 2023.03.06 |
[백준 - 1316][Python] 그룹 단어 체커 (0) | 2023.03.03 |
[백준 - 1920][Python] 수 찾기 (0) | 2023.03.02 |
[백준 - 25206][Python] 너의 평점은 (0) | 2023.02.26 |