-
for문에 list 넣기 for문에 그냥 list 넣을 수 있는데, list 상수 아니면 range 빼고 그냥
ex)for var in [a, b] -
문제 좀 읽자... 강의에서는 시작 값이 0, 점화식에서 start = middle - 1, end = middle + 1이었고, middle 구하는 게 start+(end-start)//2 (몫만 구하기) 였다.
(어차피 중간 값 탐색했고 정수만 보니까 +-1해서 무한 루프도 피하고 중복 검색도 피하고)
하지만 정답은 시작 값이 1, 점화식에서 -1, +1이 없음 → 문제에 적혀 있다!!!
왼쪽 l=1, 오른쪽 r=400이 되고, 중간 페이지 c= int((l+r)/2)로 계산한다.
| A | B | |
|---|---|---|
| 첫 번째 탐색 | l=1, r=400, c=200 | l=1, r=400, c=200 |
| 두 번째 탐색 | l=200, r=400, c=300 | l=1, r=200, c=100 |
| 세 번째 탐색 | l=1, r=100, c=50 | |
| → 여기 보면 l(시작) 또는 r(끝)이 중간 값 자체로 대체됨, l(시작) 값도 1로 나와있음. |
둘 다 start와 end사이 값을 구한다는 것은 같지만 원래식이 오버플로우 예방
원래 식: start+((end-start)//2) → start 값 위에 end-start//2값이 더해짐
문제: start+end//2 → start와 end 다 더하고 //2
- 탐색 횟수 time 계산 오류
현재 코드에서는
middle == var일 때time을 증가시키지 않는다. 첫 번째 시도에서 바로 답을 찾았다면time은 1이 되어야 함. 어차피 승자 찾기라서 문제는 없었지만… 헛점 투성이
내 코드: time 계산 오류, middle 값 오류 → 그치만 답은 나옴;
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
# ///////////////////////////////////////////////////////////////////////////////////
p, a, b = map(int, input().split()) #end 변수도 초기화 해야함...
winner = []
answer = 0
for var in [a, b]: # range()는 정수만! 리스트 자체 넣으려면 range 빼고
start = 1
middle = 0 # 항상 변수를 초기화 / 정의하자
time = 0 # a 걸린 시간, b 걸린 시간
end = p
while start <= end: # 탐색 범위가 있어야 찾아보지, break가 어딘가에는 있어야
middle = start+(end-start)//2 # 이건 운이 좋았다, 답은 int((l+r)/2)
#print (middle)
if middle < var:
time += 1
start = middle
elif middle == var:
winner.append(time)
break
else:
time += 1
end = middle
# 승자 판별
if winner[0] < winner[1]:
answer = "A"
elif winner[0] == winner[1]:
answer = 0
else:
answer = "B"
print (f'#{test_case} {answer}')gemini 개선 코드
T = int(input())
for test_case in range(1, T + 1):
# P: 전체 페이지, A: A가 찾을 페이지, B: B가 찾을 페이지
p, a, b = map(int, input().split())
results = [] # A와 B의 탐색 횟수를 저장
for target in [a, b]:
start = 1
end = p
count = 0
while start <= end:
count += 1
middle = (start + end) // 2 # 문제에서 제시한 공식
if middle == target:
results.append(count)
break
elif middle < target:
start = middle
else:
end = middle
# 승자 판별
cnt_a, cnt_b = results[0], results[1]
if cnt_a < cnt_b:
answer = "A"
elif cnt_a > cnt_b:
answer = "B"
else:
answer = 0
print(f'#{test_case} {answer}')