Python/알고리즘 문제 풀이

[코테] 푸드 파이트 대회

마이구미+ 2023. 5. 19. 11:55

<로직 고민>

  • 일단 왼쪽 사람이 먹을 음식 배치 문자열을 만든 다음 그 배치의 역순 문자열을 만들고
  • 왼쪽 문자열 + 0 + 역순 문자열 이렇게 하면 되지 않을까? 하는 생각이 든다
  • food[1]부터 시작해서 food[len(food)]까지 2로 나눈 몫 수만큼 문자열에 i에 담긴 숫자로 추가해보자
  • 약간의 고난(IndexError, TypeError)이 있었지만...어찌저찌 잘 해서 내가 생각한 대로 코드를 짰다
  • 근데 1점밖에 못 얻었다 ㅋㅋㅋ
  • 초 단순 풀이법이라 그런가....
  • for문 2개 써서 그런가...?
def solution(food):
    left = ''
    for i in range(1, len(food)):
        share = food[i] // 2
        for j in range(share):
            left += str(i)
    right = "".join(sorted(left, reverse=True))
    answer = left + "0" + right
    return answer
  • 이렇게 써서 채점도 했는데 천재풀이1 보고 내 풀이 바꿨다 ㅎㅎ...for문 없앰
  • j를 활용할 일이 없다는 걸 알았을 때 for문은 버려야 하는구나 깨달았어야 했는데 ㅋㅋㅋ후..
  • right도 left[::-1]로 쓰고 싶은데 굳이굳이 join 메서드 생각해 낸 내 머리를 존중하기 위해 그대로 두었다

<완성된 코드>

def solution(food):
    left = ''
    for i in range(1, len(food)):
        share = food[i] // 2
        left += str(i) * share
    right = "".join(sorted(left, reverse=True))
    # right = left[::-1] <- 더 간편하게 역순으로 바꾸는 방법..
    answer = left + "0" + right
    return answer


print(solution([1, 3, 4, 6]))   # 1223330333221
print(solution([1, 7, 1, 2]))   # 111303111

<다른 사람 풀이>

- 천재풀이1

def solution(food):
    first = ''.join(str(foodNumber) * (quantity // 2) for foodNumber, quantity in enumerate(food))
    second = first[::-1]
    answer = first + '0' + second
    return answer
  • 하.. 이런 건 print 찍어볼 수도 없게 해놨네
  • 나도 enumerate 써보려고 했는데 이렇게 썼어야 했군
  • 아 foodNumber를 str으로 감싸면 quantity // 2 의 값만큼 숫자가 써지는구나..
  • 이런 생각을 어떻게 하지...나도 이걸 알았으면 굳이 2번째 for문 쓸 필요가 없었네
  • 근데 그럼 0은 어떻게 되는거지...??
  • foodNumber가 0부터 시작하니까 0122333 이렇게 찍혀야 하는 거 아닌가? (첫 번째 예시 기준)
  • 근데 first print 해보면 122333만 찍힘...뭐지...???
  • 아 대박...1 // 2 = 0인데 str(0)이랑 곱하면 아무것도 안 찍힌다 대박 신기...무슨 문자열이든 숫자 0과 곱해지면 그냥 사라지는군...
  • 아 그리고 역순으로 바꾸는 거 [::-1]...넘 오랜만이라 생각하지 못 했다...ㅠ