본문 바로가기

WINK-(Web & App)/개인 스터디 & 프로젝트

알고리즘 2인 스터디 #2주차 - 이총명

반응형

브론즈1 랜덤디펜스

문제 설명 : 반에서 3명의 후보에 대해서 n명의 학생들이 투표를 하는데 내가 좋아하는 후보 순으로 3,2,1 점을 각각

줄 수 있다. 가장 점수의 합이 높은 후보가 뽑히고 점수가 높은 후보를 뽑고 점수가 똑같으면 3점이 많은 후보를, 3점 개수도 같으면 2점이 많은 후보를 선출하고 2점 개수도 같으면 0과 최고 점수를 출력한다.

 

내 코드

import sys

one = []
two = []
three = []

n = int(sys.stdin.readline())
data = [(sys.stdin.readline().strip()).split() for i in range(n)]

for i in data:
    one.append(int(i[0]))
    two.append(int(i[1]))
    three.append(int(i[2]))

a = int(sum(one))
b = int(sum(two))
c = int(sum(three))

li123 = sorted(
    [
        [a, one.count(3), one.count(2), 1, a],
        [b, two.count(3), two.count(2), 2, b],
        [c, three.count(3), three.count(2), 3, c],
    ]
)

li = [a, b, c]
li = sorted(li)


if a > b and a > c:
    print(1, sum(one))
elif b > a and b > c:
    print(2, sum(two))
elif c > b and c > a:
    print(3, sum(three))
else:
    if li123[2][1:2] == li123[1][1:2]:
        print(0, max([a, b, c]))
    else:
        print(li123[2][3], li123[2][4])

풀이 : 극한의 조건문으로 풀기에는 조건이 생각보다 많아서 힘들고 여러 원소를 가진 리스트들이 있을때 가장 앞에 있는 원소의 가중치가 가장 크다는 걸 활용해서 후보 x의 총 점수, 3점개수, 2점개수, 1점개수 순으로 리스트에 넣어줘서 sorted 함수를 썼다.

 

문제 설명 : 문제 설명은 딱히 할게 없다.

 

내 코드

import sys

n = int(sys.stdin.readline())
data = [(sys.stdin.readline().strip()).split() for i in range(n)]
li = []
li2 = []
dic = {
    "A+": 4.3,
    "A0": 4.0,
    "A-": 3.7,
    "B+": 3.3,
    "B0": 3.0,
    "B-": 2.7,
    "C+": 2.3,
    "C0": 2.0,
    "C-": 1.7,
    "D+": 1.3,
    "D0": 1.0,
    "D-": 0.7,
    "F": 0.0,
}

for i in range(n):
    li.append(float(data[i][1]))
    li2.append(float(data[i][1]) * float(dic[data[i][2]]))

a = round(sum(li2) / ((sum(li))) + 0.000000000001, 2)
print(f"{a:.2f}")

풀이 : dic[data[i][2] 의 형태로 딕셔너리에서 이차원 리스트의 원소값을 찾는 야무진 코드를 짰다.

사실 제일 어려운건 소수점을 2째 자리까지 반올림 하는 거 였는데 round()는 2.5를 2로 처리해버려서 냅다 쓸수는 없었다.

그래서 킹갓 플레 성훈님의 도움으로 마지막 줄 같은 형태로 (2.5여도 3이 되게끔 0.00000001을 2.5에 더해주고 f스트링 사용) 만들었다.

반응형