[백준 1011번 파이썬] Fly me to the Alpha Centauri

이은택·2021년 6월 22일
0

알고리즘

목록 보기
1/15
post-thumbnail

백준 1011번 Fly me to the Alpha Centauri
https://www.acmicpc.net/problem/1011
내일 스터디 그룹에서 서로 풀었던 문제들의 방식을 설명해보기로 해서 각줄마다 주석을 달았다.

def findShortCut(lightdistance):

# 광년 구하는 식의 규칙
# 수식 모양
# 광년 = 2a + b
# 광년 = 2a       #[a안에 마지막 숫자보다 큰 1이 추가되있음]
#
# 광년 = 2(1+2+3+...+ 마지막 숫자) + (합의 구성하는 숫자들 중에 제일 큰 숫자 = 1 + 마지막 숫자 )
#
# 광년 = 2(1+2+3+...+ 마지막 숫자) + 마지막 숫자 + ( 1 + 마지막숫자)
# 예시
# 29 = 2(1+2+3+....+ 4) + 4+5
# 광년+1 = 2(1+2+3+...+ 마지막 숫자) + 0
# 예시
#  30 = 2(1+2+3+ ....+4 + 5) + 0
# 광년 = 각각의 숫자들은 한번 이동을 의미함

sum = 0
number = 0
result = 0

# 수식(광년 = 2a + b) 안에 있는 2a의 이동수 구하기
while lightdistance >= 2 * sum:
    result = sum, number # while 문을 빠져나갈때 while 문 안에 있는 수식의 영향을 받지 않기 위해 합, 숫자 값 저장
    number += 1 # 마지막숫자
    sum = sum + number # 두번반복되는 숫자들의 합 = 두번반복되는 숫자들의 합 + 마지막숫자
new_sum, new_number = result # 저장되있는 두번반복되는 숫자들의 합과 마지막숫자를 다른 두변수에 저장
countMoved = new_number * 2 # while 문을 빠져나왔으니 마지막숫자를 이용해 움직인 횟수를 저장해둠


sumNoRepeatNumbers = lightdistance - 2*new_sum # 반복하지 않는 숫자들의 합을 저장


# 수식(광년 = 2a + b) 안에 있는 b의 이동수 구하기
onewayNumber = new_number + 1 # 반복하지 않는 숫자들 중 가장 가능성있는 큰숫자를 저장
while onewayNumber > 0: # 가능성있는 숫자가 0과 같거나 작아지면 while 루프 탈출
    if sumNoRepeatNumbers > onewayNumber: # 합이 제일큰 숫자보다 클경우
        onewayNumber -= 1 # 제일 큰 숫자에서 1을 빼줌
        sumNoRepeatNumbers = sumNoRepeatNumbers - onewayNumber # 다음에 넘겨줄 합은 합 - 제일 큰 숫자
        countMoved += 1 # 움직인 횟수에 1을 추가
    elif sumNoRepeatNumbers < onewayNumber: # 합이 제일큰숫자보다 작을 경우
        onewayNumber -= 1 #제일큰 숫자에서 1을 빼줌
        continue # 제일큰숫자가 합에 존재 하지 않기 때문에 continue를 써서 while루프 조건에 다시 돌아간다

    else: #합에서 마지막으로 남은 숫자
        onewayNumber -= sumNoRepeatNumbers # 두 변수중 while 루프를 탈출하기 위해서 지정해둔 제일큰숫자에서 합을 뺀다
        countMoved += 1 # 움직인 횟수 1추가
return countMoved # 최소로 움직인 횟수

lineNumber = input()
lineNumber = int(lineNumber)
distance_list = list()
while lineNumber > 0:
lineNumber -= 1
distance_list.append(input())
for i in distance_list:
x,y = i.split()
distance = int(y) - int(x)
print(findShortCut(distance))

print(distanceList)

# ['0 3', '1 5', '45 50']

profile
도전!

0개의 댓글