빠르게 입력받고 출력하는 문제
오답 😯 (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()의 형태로 변수 선언은 가능
입력이 끝날 때까지 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 구문을 집어넣음!
원래 수로 돌아올 때까지 연산을 반복하는 문제
오답 😯 (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)
배운 것 💪✨
- //, % 유용하게 쓰기!
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)로 표현할 수 있다!
오답 😯
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을 반환
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(...))는 만족하는 요소(숫자)의 합
잘 보고 갑니다! try-except 구문을 잘 이용하면 정말 쓸모가 많은 것 같네요. 숫자를 문자처럼 나누어서 다루고 싶을 때 //과 %를 이용하는 게 되게 효과적이네요.