[백준] 15552 / 10951 / 1110 / 8958 / 4344 / 1065

dosilv·2021년 3월 16일
0
post-thumbnail
post-custom-banner

15552 빠른 A+B

빠르게 입력받고 출력하는 문제

오답 😯 (ValueError)

import sys
x = int(input())  #테스트케이스 횟수
for i in range(x):
    a, b = map(int, sys.stdin.readline())  #입력값 받아서 int 함수 적용
    print(a+b)

정답 🥳

import sys
x = int(input())
for i in range(x):
    a, b = map(int, sys.stdin.readline().split())  #input과 마찬가지로 한 줄에 여러 값 입력받을 경우 split() 필요
    print(a+b)

배운 것 💪✨

  • sys.stdin.readline()

    • 반복문으로 여러 줄 입력받는 문제는 input() 사용시 시간초과가 발생할 수 있음. import sys 후 sys.stdin.readline() 사용하기!
    • 개행문자가 함께 입력되기 때문에 .strip()으로 '\n'을 제거해 줘야 함
    • 하지만 입력받은 값에 int() 또는 .split() 함수 적용시 .strip()은 불필요

  • map()의 결과를 불러오려면 list()함수 필요! but a, b, c,...(input 값 개수만큼) = map()의 형태로 변수 선언은 가능

10951 A+B - 4

입력이 끝날 때까지 A+B를 출력하는 문제. EOF에 대해 알아 보세요.

오답 😯

import sys
while True:
    a, b = map(int, sys.stdin.readline().split())
    print(a+b)
    if not sys.stdin.readline():  #입력값이 false면(없다면)...을 표현하고 싶었다..
        break

idle에 넣고 돌려보니 홀수번째 출력값만 나왔다. if not sys.stdin.readline(): 이 부분에서 짝수번째 입력값들이 사용돼버려서 그런가 보다!

정답 🥳

import sys
while True:
    try:
        a, b = map(int, sys.stdin.readline().split())
        print(a+b)
    except:
        break

배운 것 💪✨

  • EOF(End-Of-File)
    파일의 끝! 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타냄.

  • 파이썬의 EOF 처리 방법
    while True 아래에 try-except 구문을 집어넣음!

1110 더하기 사이클

원래 수로 돌아올 때까지 연산을 반복하는 문제

오답 😯 (IndexError)

a = input()
count = 0
t = a
while True:
    x, y = (t[0], t[1])  #입력값을 string 형태 그대로 이용
    b = int(x) + int(y)
    c = y + str(b%10)  #"3"+"6"="36"
    count += 1
    if (c == a): break
    else: t = c
print(count)

값이 일의자릿수가 되면 index 1 호출이 불가능해짐 (line 5)

정답 🥳

a = int(input())
count = 0
t = a
while True:
    b = (t//10) + (t%10)  #string index 대신 //, % tldyd
    c = (t%10)*10 + (b%10)  #*10 중요!
    count += 1
    if (c==a):
        break
    else:
        t = c
print(count)

배운 것 💪✨

  • //, % 유용하게 쓰기!

8958 OX퀴즈

OX 퀴즈의 결과를 일차원 배열로 입력받아 점수를 계산하는 문제

정답 🥳

a=int(input())
for i in range(a):
    score = 0  #총 점수
    ox = input()
    x = 1  #기본 획득점수: 1점
    for i in ox:
        if i == 'O':
            score += x  #총 점수 + 획득점수
            x += 1  #O가 연속될 때마다 획득점수가 1점씩 올라감 
        else: x = 1  #X가 나올 경우 획득점수는 다시 1점
    print(score)

숏코딩 🧐

1번
n,*l=open(0) for i in l: n=0; print(sum((n:=(n+1)*(j=='O'))for j in i))
2번
exec("print(sum(v*-~v//2for v in map(len,input().split('X'))));"*int(input()))

배운 것 💪✨

  • n=0을 선언하고 for문 내에 n:=(n+1)을 쓰면 한 번 돌 때마다 1씩 증가하는 변수 n이 된다
  • 숫자*(True)숫자*1과 같고 숫자*(False)숫자*0과 같음
  • exec()
    문자열을 받아서 함수로 실행시킨다
    여러 실행문을 하나의 스트링으로 저장해서 실행 가능
  • ~n = -(n+1)
    ~기호가 무슨 의미인지 몰라서 파이썬으로 숫자 몇 개 넣어봤더니 저렇다는 걸 알았다..ㅎㅎ;
    그래서 1부터 n까지 수의 합은 n*-~n/2(=n(n+1)/2)로 표현할 수 있다!

4344 평균은 넘겠지

오답 😯

import sys
a=int(input())
for i in range(a):
    b=list(map(int, sys.stdin.readline().split()))
    avg = sum(b[1:])/b[0]  #평균 = 점수 총합/인원수
    x = [i for i in b[1:] if i>avg]  #평균 이상인 점수의 리스트
    print(str(round(len(x)/b[0]*100, 3))+'%') #비율 구해서 문자열로 나타내고 % 더하기

경우에 따라 소수점 셋째자리까지 출력이 안 돼서 오답
예) 40%의 경우 40.000%이 아닌 40%로 출력

정답 🥳

import sys
a=int(input())
for i in range(a):
    b=list(map(int, sys.stdin.readline().split()))
    avg = sum(b[1:])/b[0]
    x = [i for i in b[1:] if i>avg]
    result = round(len(x)/b[0]*100, 3)
    print(f"{result:.3f}%")

배운 것 💪✨

  • round(x, y) VS. f"{x:.yf}"
    x = 변환할 값
    y = 표현할 자릿수
    만약 x=100, y=2일 경우 round는 100, f-string은 100.00을 반환

1065 한수

X가 한수인지 판별하는 함수를 정의하여 문제를 해결해 봅시다.

정답 🥳

a = int(input())
result = 0
for i in range(1, a+1):
    if (i<=99):
        result += 1
    else:
        x = i//100
        y = i%100//10
        z = i%100%10
        if (x-y)==(y-z):
            result += 1
print(result)

숏코딩 😯

print(sum((N//100-N//10%10==N//10%10-N%10)|(N<100)for N in range(1,int(input())+1)))

배운 것 💪✨

  • sum([조건] for i in range(...))

    해당 형태로 만들 경우 조건이 참인 요소의 갯수를 구할 수 있다! (true=1, false=0으로 계산)
    sum(i for i in range(...))는 만족하는 요소(숫자)의 합

profile
DevelOpErUN 성장일기🌈
post-custom-banner

2개의 댓글

comment-user-thumbnail
2021년 3월 16일

잘 보고 갑니다! try-except 구문을 잘 이용하면 정말 쓸모가 많은 것 같네요. 숫자를 문자처럼 나누어서 다루고 싶을 때 //과 %를 이용하는 게 되게 효과적이네요.

1개의 답글