본문 바로가기

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

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

반응형

브론즈1 랜덤디펜스

문제 설명 : 적혀있는 예시만 보면 이해하기 어려울 수도 있는데 1로 시작하면 1 > 11 > 12 > 23 > 35 > 58 > 83 > 31

이런 식으로 진행된다.

 

내 코드 : 

cycle = 0
first = input()
num = first
big = 0

while True:  # while True:
    if int(num) < 10:
        num = str(int(num) * 10 + int(num))

    elif int(num[0]) + int(num[1]) < 10:  # 50
        num = num[1] + str(int(num[0]) + int(num[1]))  # num = 0 + 5

    elif int(num[0]) + int(num[1]) >= 10:
        big = str(int(num[0]) + int(num[1]))  # == 10
        num = str(int(num[1])) + str(int(big[1]))  # == 50

    cycle += 1
    if int(str(num)) == int(first):
        print(cycle)
        break

처음에 받은 수를 기억하고 있어야하지만 그 수를 변형시키면서 코드가 진행되야 하기에 num = first로

num에 처음에 받은 수를 저장했다. 처음 받은 수가 10 미만인지 아닌지로 조건문을 구분해서 달았다.

if int(num) < 10:

여기에서 안 걸렸으면 10이상이라는 소리니까 

int(num[0]) + int(num[1])

이렇게 num[1]을 구해도 인덱스 에러가 나지 않는다.

 

어떤 경우에는 문자열의 더하기 방식을 사용해야 하고 어떤 경우에는 그냥 덧셈 연산을 해야해서

int랑 str 함수를 야무지게 사용해야 했다.

마지막 줄에

if int(str(num)) == int(first):

이렇게 안하고 str함수로 감싸놓기만 하면 00이랑 0을 다른 숫자로 인식해버리기 때문에 반드시 int를 사용해야한다.

 

문제 설명보다는 예시를 보는게 좋을 것 같다.(절대 귀찮아서 이러는거 맞음)

내 코드

import sys

t = int(input())


for i in range(t):
    over = 0
    data = list(map(int, sys.stdin.readline().split()))
    average = sum(data[1:]) / (len(data) - 1)

    for ii in range(1, len(data)):
        if data[ii] > average:
            over += 1
    a = (over / (len(data) - 1)) * 100
    b = str(round(a, 3))
    ind = b.index(".")

    while len(b) - ind < 4:
        b = b + "0"

    print(b, "%", sep="")


풀이 : 겁나 쉬워보이지만 입력의 첫번째 값은 평균을 낼 때 빼야하므로 슬라이싱을 적절히 사용해줘야 했다.

average = sum(data[1:]) / (len(data) - 1)

(그래서 평균낼 때 이렇게 함)

 

제일 짜증나는 부분은 무조건 40%도 40.000% 이렇게 소수점 3번째 자리까지 출력시키는 부분이였다.

나는 출력해야할 결과물을 b에 str로 저장하고 소수점의 인덱스를 ind에 저장한 뒤 

    while len(b) - ind < 4:
        b = b + "0"
 

이렇게 소수점 자리수를 맞춰줬다.

 

 

 

반응형