구름LEVEL 1단계 - 의좋은 형제 (Python)
https://level.goorm.io/exam/49088/%EC%9D%98%EC%A2%8B%EC%9D%80-%ED%98%95%EC%A0%9C/quiz/1
구름LEVEL
난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다.
level.goorm.io
문제설명
조선시대 수도 한양에서 한참 떨어진 곳에 위치한 한 고을에는 의좋은 형제가 살았다. 서로를 끔찍이 아낀다고 소문난 진우와 선우 형제는 항상 서로에게 퍼주지 못해 안달이 난 상태였다. 의리있는 만큼 성실했던 두 형제는 열심히 일하여 번 돈으로 식량을 어마어마하게 비축하여 가지고 있었다.
그러던 어느날, 진우는 밤 중에 몰래 집을 나와 자신의 식량 절반을 선우에게 가져다 주었다. 이 사실을 안 선우는 다음날 밤, 몰래 집을 나와 마찬가지로 자신의 식량 절반을 진우에게 가져다 주었다. 가지고 있는 식량의 양이 홀수라서 반으로 나눌 수 없는 경우, 그 식량을 통째로 넘겨준다. 만약 처음 두 형제가 모두 식량을 100씩 가지고 있다면 셋째 날 까지의 변화는 다음과 같다.
처음 상태 : 진우 100, 선우 100
첫째 날 : 진우 50, 선우 150
둘째 날 : 진우 125, 선우 75
셋째 날 : 진우 62, 선우 138
매일 밤 계속되는 이 모습을 지켜본 동네 꼬마는 문득 D번째 날에는 두 형제에게 식량이 얼마나 남아있을지 궁금해졌다. D번째 날에 진우와 선우는 식량을 얼마나 갖고 있을지 출력하라.
제한조건
첫째 줄에는 진우와 선우가 처음 갖고 있는 식량의 양이 정수로 주어진다 단, 1<=N1, N2 <=10000
둘쨰 줄에는 두 형제의 식량의 양을 알고 싶은 날 D가 정수로 주어진다. 단 1 <= d <= 100
D번째 날에 진우, 선우 순서로 갖고 있는 식량의 양을 공백으로 구분하여 출력한다.
입출력 예
n | d | answer |
100 100 | 4 | 131 69 |
70 100 | 1 | 35 135 |
1 1 | 9 | 0 2 |
537 141 | 11 | 226 452 |
answer
user_input = input("식량의 양 (띄어쓰기로 구분)")
day = int(input("day\n"))
user_input = user_input.split() #입력받은 식량의 양을 split을 사용해 띄어쓰기기준으로 나눈다
a = int(user_input[0])
b = int(user_input[1]) #split으로 나눈 값중 0번째 위치한 값을 a에 1번째 위치한 값을 b에 담는다
n = 0 #무한루프를 돌릴때 멈출 기준점을 잡기위해 변수에 0을 담는다
while 1: #무한루프를 돌린다.
n += 1 #횟수(날짜)를 세기위해 1씩 더해준다
if n % 2 == 0: #짝수일과 홀수일(첫째날, 둘째날 등)을 구분하기위한 코드 짝수=선우, 홀수=진우
if b % 2 == 0: #선우의 식량이 짝수일때
a += (b / 2)
b -= (b / 2)
#절반의 식량을 진우에게 주고 자신의 식량에서 같은 값만큼 빼준다.
else: #선우의 식량이 홀수일때
a += (b // 2) + 1
b -= (b // 2) +1
#절반의 식량+1을 진우에게 주고 자신의 식량에서 같은 값만큼 빼준다.
else:
if a % 2 == 0: #진우의 식량이 짝수일때
b += (a / 2)
a -= (a / 2)
#절반의 식량을 선우에게 주고 자신의 식량에서 같은 값만큼 빼준다
else: #진우의 식량이 홀수일때
b += (a // 2) + 1
a -= (a // 2) + 1
#절반의 식량+1을 선우에게 주고 자신의 식량에서 같은 값만큼 빼준다
if n == day: #n(날짜)이 입력받은 날짜(day)와 같으면 멈춘다.
break
print(int(a), int(b))
항상 말하지만 제코드가 꼭 정답은 아닙니다.
더욱더 효율적인 코드는 항상 존재하며 while이 아니라 다른 방법도 있을것입니다.
제가 풀때는 해당방법이 효율적이라고 생각이 들었고 while문 말고는 생각나지 않아 이렇게 풀었습니다.
혹시 다른 풀이나 더 효율적인 방법이 있다면 댓글로좀 알려주세요!