보물창고 블로그

SW Expert Academy 5644. [모의 SW 역량테스트] 무선 충전 본문

알고리즘 풀이/SW Expert Academy

SW Expert Academy 5644. [모의 SW 역량테스트] 무선 충전

홋 메 2020. 3. 10. 21:00
728x90

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo&categoryId=AWXRDL1aeugDFAUo&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

해결한 코드는 아래와 같다.

def checker(x, y, chargers):
    sub = []
    for i in range(len(chargers)):
        cy, cx, c, p = chargers[i]
        cy -= 1
        cx -= 1
        if abs(cy - y) + abs(cx - x) <= c:
            sub.append(i)
    return sub


t = int(input())
for test in range(1, t + 1):
    m, a = map(int, input().split())
    m1 = list(map(int, input().split()))
    m2 = list(map(int, input().split()))
    charger = [list(map(int, input().split())) for _ in range(a)]
    time = 0
    s1 = 0
    s2 = 0
    x1, y1 = 0, 0
    x2, y2 = 9, 9
    while time <= m:
        dx = [-1, 0, 1, 0]
        dy = [0, 1, 0, -1]
        c1 = checker(x1, y1, charger)
        c2 = checker(x2, y2, charger)
        # 둘다 없을 때
        if not c1 and not c2:
            pass
        elif len(c1) == 0:
            c2.sort(key=lambda x: charger[x][3], reverse=True)
            s2 += charger[c2[0]][3]

        elif len(c2) == 0:
            c1.sort(key=lambda x: charger[x][3], reverse=True)
            s1 += charger[c1[0]][3]

        # 둘다 1개씩일 때
        elif len(c1) == 1 and len(c2) == 1:
            # 서로 같지 않을 때
            if c1[0] != c2[0]:
                s1 += charger[c1[0]][3]
                s2 += charger[c2[0]][3]
            # 서로 같을 때
            elif c1[0] == c2[0]:
                s1 += charger[c1[0]][3] // 2
                s2 += charger[c2[0]][3] // 2
        elif len(c1) == 1:
            s1 += charger[c1[0]][3]
            mv2 = 0
            for i in c2:
                if i != c1[0] and mv2 < charger[i][3]:
                    mv2 = charger[i][3]
            s2 += mv2
        elif len(c2) == 1:
            s2 += charger[c2[0]][3]
            mv1 = 0
            for i in c1:
                if i != c2[0] and mv1 < charger[i][3]:
                    mv1 = charger[i][3]
            s1 += mv1
        # 둘다 2개이상씩 될 때
        else:
            c1.sort(key=lambda x: charger[x][3], reverse=True)
            c2.sort(key=lambda x: charger[x][3], reverse=True)
            if c1[0] == c2[0]:
                if charger[c1[1]][3] > charger[c2[1]][3]:
                    s1 += charger[c1[1]][3]
                    s2 += charger[c2[0]][3]
                else:
                    s1 += charger[c1[0]][3]
                    s2 += charger[c2[1]][3]
            else:
                s1 += charger[c1[0]][3]
                s2 += charger[c2[0]][3]
        if time < m:
            mov1 = m1[time]
            mov2 = m2[time]
            if mov1 != 0:
                x1 += dx[mov1 - 1]
                y1 += dy[mov1 - 1]
            if mov2 != 0:
                x2 += dx[mov2 - 1]
                y2 += dy[mov2 - 1]
        time += 1
    print('#{} {}'.format(test, s1 + s2))
Comments