TIL#32 PYTHON 예제연습 (5)

dnpxm387·2020년 8월 13일
0

python

목록 보기
28/43
post-thumbnail

숫자의 개수

세개의 자연수 a, b, c를 곱하였을 때 나오는 값에서 0부터 9까지 각각의 숫자가 몇번씩 쓰였는지 출력. a, b, c 입력 한줄씩. 0부터 9까지 몇번씩 쓰인건지 각각 한줄씩 출력.

import sys
a = int(sys.stdin.readline())
b = int(sys.stdin.readline())
c = int(sys.stdin.readline())
sum = list(str(a * b * c))

for i in range(10):
    n = sum.count(str(i))
    print(n)

count 함수를 기억하지 못했다면 완전히 노가다로 풀었어야 할 문제. 예제를 많이 풀어봐야 기억이 더 잘나고 익숙해질 것 같다.

서로 다른 나머지

음이 아닌 정수 10개를 각줄에 걸쳐 입력. 42로 나누었을 때 서로 다른 나머지가 몇개인지 출력.

import sys
li = [int(sys.stdin.readline().rstrip()) for i in range(10)]
l = []
for num in li:
	l.append(num % 42)
	s = set(l)
print(len(s))

중복이 안되는 set 자료형을 이용했다. 답을 맞춘후 구글링을 통해 찾아보니 더 간단하게 작성한 사람도 있었다.

# 더 간단한 예
li = []
for i in range(10):
	n = int(input())
	li.append(n % 42)
li = set(li)
print(len(li))

입력도 for문 안에 집이넣어 더 간결하게 만들었다. 중복이 안되는 set 자료형을 이용했단 점은 같았다.

새로운 평균

과목수 N 첫줄, 점수들 둘째줄에 입력. 점수/최댓값 에 100을 곱하여 새로운 성적만들고 새로운성적의 평균구하기.

import sys
N = int(sys.stdin.readline())
score = list(map(int, sys.stdin.readline().split()))
s_max = max(score)
new_score = []
for i in range(N):
    new_score.append(score[i] / s_max * 100)
print(sum(new_score) / len(new_score))

리스트에서도 sum, max, min 함수가 적용된다.

OX 더하기 -수정도 많이 하고 애먹은 문제..

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
첫째줄에 테스트의 개수 n 입력. 테스트 한줄씩 개수만큼 입력. 테스트 한개마다 점수 출력.

import sys
n = int(sys.stdin.readline())

for i in range(n):
    score = list(str(sys.stdin.readline().rstrip()))
    count = 0
    arr = []
    for j in score:
        if j == 'O':
            count += 1
            arr.append(count)
        else:
            count = 0
    print(sum(arr))

평균넘는학생 비율

첫째줄에 테스트 수 n. 둘째줄 첫수는 학생수, 뒤부터 학생들점수 입력. 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력.

import sys
num = int(sys.stdin.readline())

for i in range(num):
    score = list(map(int, sys.stdin.readline().split()))
    n = 0
    avg = sum(score[1:]) / score[0]
    for k in range(1, len(score)):
        if score[k] > avg:
            n += 1
    print(str("%0.3f" % round(n / score[0] * 100, 3))+'%')

round
반올림 할 때는 round 내장함수를 이용.
round(a, b) 형식. round(a) 형식이면 소수 첫째자리에서 반올림.
round(4.16) -> 결과는 4
round(4.16, 1) -> 소수점 첫째자리까지 반올림함. 결과는 4.2
만약에 반올림할 수가 5이면, 5 앞의 숫자가 짝수이면 내림, 홀수이면 올림을 한다.
round(3.5) -> 결과 4
round(4.5) -> 결과 4
round(3.35, 1) -> 결과 3.4
round(3.25, 1) -> 결과 3.2

셀프넘버

백준 4673번 문제였는데 정말 너무 모르겠어서 구글링을 했고, 풀이를 보면서 이렇게 풀 수도 있구나 생각이 들어 또 혼자 감탄했다..😅
예제를 풀면서 많은 것을 더 배우고 있는 것 같다.

natural_num = set(range(1, 10001))
generated_num = set()

for i in range(1, 10001):
    for j in str(i):
        i += int(j)
    generated_num.add(i)

selfnumber = natural_num - generated_num

for k in sorted(selfnumber):
    print(k)

한수구하기

백준 1065번.

import sys

num = int(sys.stdin.readline())
n = 0

for i in range(1, num+1):
    if i < 100:
        n += 1
    else:
        num_list = list(map(int, str(i)))
        if num_list[0] - num_list[1] == num_list[1] - num_list[2]:
            n += 1
print(n)

알파벳 찾기

백준 10809번.

import sys
import string
n = sys.stdin.readline().rstrip()
asc = list(string.ascii_lowercase)
answer = []
for i in asc:
    if i in n:
        answer.append(str(n.index(i)))
    else:
        answer.append('-1')
print(" ".join(answer))

a-z까지를 for문으로 돌려야 해서 string 모듈에 있는 ascii_lowercase 메서드를 이용해서 리스트로 묶어줌.

유용한 string 모듈 기능

ascii_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
digits = '0123456789'
hexdigits = '0123456789abcdefABCDEF'
octdigits = '01234567'
printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU...
punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
whitespace = ' \t\n\r\x0b\x0c'
profile
개발자꿈나무🌲

0개의 댓글