문제
20364번: 부동산 다툼
첫 번째 줄에 땅 개수 N과 꽉꽉나라에 사는 오리 수 Q가 공백으로 구분되어 주어진다. (2 ≤ N < 220, 1 ≤ Q ≤ 200,000) 두 번째 줄부터 차례로 Q개의 줄에 걸쳐 i+1번째 줄에는 i번째 오리가 원하
www.acmicpc.net
알고리즘
- 반복문을 통해 오리들이 원하는 땅을 가지도록 한다.
- 다른 오리가 점유된 땅을 밟는지 확인하기 위해 자신이 원하는 땅부터 루트 땅까지 이동하면서 확인한다.
- 다른 오리가 이미 점유한 땅을 밟았다면, 땅의 번호를 변수에 넣어둔다.
- 반복이 끝나고 난 후 다른 오리가 점유한 땅을 밟은 땅의 번호가 처음으로 밟는 땅으로, 그 땅의 번호를 출력한다.
- 다른 오리가 점유한 땅을 밟지 않았다면 원하는 땅을 점유하고 0을 출력한다.
코드
import sys
n, q = map(int, sys.stdin.readline().split())
visited = [0] * (n + 1) # 땅의 점유 여부
# 반복문을 통해 오리들이 원하는 땅을 가지도록 한다.
for i in range(q):
tan = int(sys.stdin.readline())
target = tan
flag = 0 # 다른 오리의 점유된 땅의 번호
# 반복문을 통해 원하는 땅에서 루트 땅까지 점유된 땅을 밟는지 확인
while target != 1:
# 점유된 땅을 밟을 경우
if visited[target] >= 1:
flag = target # 다른 오리의 점유된 땅의 번호를 초기화
# 2로 나눠 루트 땅까지 이동
target //= 2
# 루트 땅까지 이동하면서 점유된 땅을 밟았다면
if flag:
print(flag) # 밟은 땅의 번호를 출력
# 그게 아니라면 땅을 점유하고 0을 출력
else:
visited[tan] = 1
print(0)
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 1987번(파이썬): 알파벳 (0) | 2021.11.07 |
---|---|
[baekjoon] 백준 11437번(파이썬): LCA (0) | 2021.11.06 |
[baekjoon] 백준 2078번(파이썬): 무한이진트리 (1) | 2021.11.04 |
[baekjoon] 백준 13116번(파이썬): 30번 (0) | 2021.11.03 |
[baekjoon] 백준 2108번(파이썬): 통계학 (0) | 2021.11.02 |