1208 - flatten

박재현·2022년 2월 14일
0

알고리즘 부수기

목록 보기
12/43
post-thumbnail

문제 설명

SWEA 1208-faltten

문제 풀이

  1. maxFloor와 minFloor를 선언
  2. 각 floor에 해당하는 index를 maxIndex, minIndex 배열에 각각 입력
  3. maxFloor와 minFloor의 차이를 검색 후 index 배열에서 삭제
  4. maxIndex 혹은 minIndex 배열의 길이가 0이될 때까지 반복
  5. maxFloor와 minFloor의 값이 일치하거나, 덤프횟수를 다 시행했을 경우, result 출력

구현문제였지만 상당히 복잡하였다. maxFloor와 minFloor를 어떻게 효율적으로 찾고 둘을 비교할지가 관건이었다.

코드

T = 10
for tc in range(1, T+1):
    N = int(input())
    arr = list(map(int, input().split()))
    cnt = 0

    maxNum = reduce(lambda a, b: a if a > b else b, arr)
    minNum = reduce(lambda a, b: a if a < b else b, arr)


    while True:
        minIndex = []
        maxIndex = []

        for i in range(100):
            if maxNum == arr[i]:
                maxIndex.append(i)
            if minNum == arr[i]:
                minIndex.append(i)
        if not len(maxIndex) > 0:
            maxNum -= 1
            continue
        if not len(minIndex) > 0:
            minNum += 1
            continue
        maxFloor = arr[maxIndex[len(maxIndex)-1]]
        minFloor = arr[minIndex[len(minIndex)-1]]

        minLength = len(maxIndex) if len(maxIndex) <= len(minIndex) else len(minIndex)
        if cnt + minLength > N or maxNum == minNum:
            result = maxFloor - minFloor
            break
        if len(maxIndex) > len(minIndex):
            for j in range(minLength):
                arr[maxIndex[j]] -= 1
                arr[minIndex[j]] += 1
                cnt += 1
            minNum += 1
            continue

        if len(maxIndex) < len(minIndex):
            for j in range(minLength):
                arr[maxIndex[j]] -= 1
                arr[minIndex[j]] += 1
                cnt += 1
            maxNum -= 1
            continue
        else:
            for j in range(minLength):
                arr[maxIndex[j]] -= 1
                arr[minIndex[j]] += 1
                cnt += 1
            maxNum -= 1
            minNum += 1
            continue

    print(f"#{tc} {result}")

출처
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV139KOaABgCFAYh

profile
공동의 성장을 추구하는 개발자

0개의 댓글