• 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)로 계산한다.

AB
첫 번째 탐색l=1, r=400, c=200l=1, r=400, c=200
두 번째 탐색l=200, r=400, c=300l=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}')