문제 설명은 생략하고 코드에 대한 설명만 남깁니다.
코드
def solution(food):
temp = '' # 왼쪽 선수 음식
for i in range(1, len(food)):
temp += str(i) * (food[i]//2)
return temp + '0' + temp[::-1]
문제가 너무 길어 당황스러울 수 있지만, 어떻게 하면 food에 주어진 값을 양쪽에 대칭으로 배치할 수 있을지 고민해 보면 어렵지 않게 해결할 수 있다.
처음부터 코드를 작성하기보단, 문제를 이해하기 위해 먼저 메모장에 직접 적어보았다.
주어진 음식을 두 명의 선수가 공평하게 나눠먹어야 하기 때문에 0번 음식인 물을 제외한 1번 이후의 음식들을 2로 나눈 몫을 구하였다.
몫은 홀짝에 관계없이 두 선수가 공평하게 나눠먹을 수 있는 양이된다.
그러므로 몫만큼 해당 음식을 반복해 문자열로 배치하면 된다.
그럼 어떻게 양쪽에서 같은 음식을 순차적으로 먹을 수 있을지 생각해 보다 문자열을 뒤집는 방식을 선택했다.
왼쪽에 위치한 선수는 왼쪽부터 차례대로 먹고, 오른쪽에 위치한 선수는 오른쪽부터 차례대로 먹는다.
그러므로 왼쪽에 위치한 선수 기준으로 배치된 음식을 거꾸로 배치해 주면 오른쪽에 위치한 선수도 같은 순서대로 먹을 수 있다.
첫 번째 케이스인 food = [1, 3, 4, 6]을 보면 0번 음식은 1이므로 1번 음식부터 2로 나눈 몫을 구해준다.
그럼 3, 4, 6은 각각 1, 2, 3이 될 것이다.
1번 음식을 1번, 2번 음식을 2번, 3번 음식을 3번 먹게 되는 것이다.
왼쪽 선수 기준으로 이를 배치하면 '122333'이 된다.
오른쪽 선수도 똑같이 122333 순으로 먹어야 하므로 '333221'로 배치해 주면 된다.
temp = '122333'으로 왼쪽 선수 음식을 저장한 뒤 temp[::-1]을 해주면 '333221'이 나와 오른쪽 선수 음식을 구할 수 있다.
따라서 우리는 temp + 0 + temp[::-1]을 하면 구하고자 하는 답인 '1223330333221'을 구할 수 있다.