TIL(#06) - 3.06

Taewoong Moon·2021년 3월 7일
0


백준문제 개념범위

  • 1차원 배열
  • 함수
  • 문자열

문제: 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력:첫째 줄에는 테스트 케이스의 개수 C가 주어진다. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력:각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

cases_ = int(input())
for i in range(cases_):
    k = list(map(int, input().split()))
    _average = (sum(k) - k[0]) / k[0]
    _count = 0
    for j in range(1, k[0]+1):
        if k[j] > _average:
            _count += 1
    print("{0:.3f}".format(_count/k[0]*100))

배운점:

  • 입력값을 리스트 형태로 받아서 써내려 갈수 있다. list(map(int, input().split()))
  • 소숫점 셋째 자리수를 반영할 때에는 "{0:.nf}".format을 활용하고 표현하려는 변수 혹은 숫자를 format뒤 괄호안에 기입하면 된다.
  • range를 통해서 범위를 할 때 항상 (이상, 미만)인것을 확인하며 풀기

문제:

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.

양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.

예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.

생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력
입력은 없다.

출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

list1 = list()
def d(N):
    for i in str(N):
        N+= int(i)
    return list1.append(N)

for i in range(1, 10001):
    d(i)
    if i not in list1:
        print(i)

배운점:

  • list를 전역변수처럼 지정해서 값을 계속 꾸준히 쌓으면서 해당 요소안에 i 가있는지 없는지 차례대로 찾아가는 논리과정을 배움
  • 함수 활용하기 (for 구문안에 함수)

문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

    
from collections import Counter
word = list(input().upper())
frequency = Counter(word)
list1 = []
for name, value in frequency.items():
    if value == max(frequency.values()):
        list1.append(name)

        if len(list1) > 1:
            break
    if len(list1) == 1:
        print(name)
    else:
        print('?')

배운점:

  • Counter() 함수: 리스트안에있는 변수들의 frequency를 딕셔너리 형태로 뱉어 낸다.

  • items(): 딕셔너리안에 키-값을 쌍으로 묶어서 리스트로 형태로 반환하는 구조. 딕셔너리는 순서를 가지지 않기때문에 for문을 바로 사용할수는없고 items()함수를 사용해야한다.

문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳 변경
č c=
ć c-
dž dz=
đ d-
lj lj
nj nj
š s=
ž z=
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

croatia_list = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
word = input()
for croatia_word in croatia_list:
    if croatia_word in word:
        word.replace(croatia_list, 'a')
print(len(word)) 
  • 배운점: replace 함수를 이용해 반복되지 않는 문자로 변경 후 계산
  • len활용 잘해보기 (리스트, 문자열) 둘다 쓸 수 있음. 매우 유용함
profile
모든 코드에 의미를 담겠습니다.

0개의 댓글