Python - 백준 단계별로 풀어보기

수현·2023년 2월 13일
0

Coding Test

목록 보기
7/14
post-thumbnail

📍 1. 입출력

📕 사칙연산

BAEKJOON 사칙연산

문제

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 

코드

A,B = input().split()
print(int(A)+int(B))
print(int(A)-int(B))
print(int(A)*int(B))
print(int(A)//int(B)) # 몫
print(int(A)%int(B)) # 나머지

📕 ??!

BAEKJOON ??!

문제

준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

코드

id = input()

print(id+'??!')

📕 킹, 퀸, 룩, 비숍, 나이트, 폰

BAEKJOON 킹, 퀸, 룩, 비숍, 나이트, 폰

문제

체스는 총 16개의 피스를 사용하며, 킹 1개, 퀸 1개, 룩 2개, 비숍 2개, 나이트 2개, 폰 8개로 구성되어 있다.

동혁이가 발견한 흰색 피스의 개수가 주어졌을 때, 몇 개를 더하거나 빼야 올바른 세트가 되는지 구하는 프로그램을 작성하시오.

코드

chess = [1,1,2,2,2,8]

number = list(map(int, input().split()))

for i in range(len(chess)):
    print(chess[i]-number[i],end=' ')

📕 새싹

BAEKJOON 새싹

문제

새싹을 출력하시오

코드

print("         ,r\'\"7\nr`-_   ,\'  ,/\n \\. \". L_r\'\n   `~\\/\n      |\n      |\n")

풀이

  • 이스케이프 문자
    (1) \t : tap
    (2) \n : 줄을 띄움

  • 특수기호 출력
    (1) \ : 역슬래쉬 출력
    (2) \' : 작은따옴표(') 출력
    (3) \" : 큰따옴표(") 출력

📍 2. 조건문

📕 윤년

BAEKJOON 윤년

문제

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

코드

A = int(input())

if (A%4)==0 and (A%100)!=0: #!=대신 and not 사용 가능 
    print(1)
elif (A%400)==0:
    print(1)
else:
    print(0)

📕 알람 시계

BAEKJOON 알람 시계

문제

바로 "45분 일찍 알람 설정하기"이다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

코드

hour,min = map(int,input().split())

if min>=45:  # 시간이 바뀌지 않는 경우
    if hour!=0:
        print(hour, min-45)
    else:
        print(hour, min-45)
else:        # 시간이 바뀌는 경우 
    if hour!=0:
        print(hour-1, min+15)
    else:
        print(23, min+15)

📕 오븐 시계

BAEKJOON 오븐 시계

문제

훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.

코드

hour, min = map(int, input().split())
time = int(input())

cook = (60*hour + min + time) % 1440 #24시간 넘지 않기 위해서

c_hour = cook//60 # 몫 = 시
c_min = cook%60   # 나머지 = 분

print(c_hour, c_min)

📍 3. 반복문

📕 영수증

BAEKJOON 영수증

문제

영수증에 적힌,

- 구매한 각 물건의 가격과 개수
- 구매한 물건들의 총 금액

을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자

코드

X = int(input()) # N = 영수증에 적힌 총 금액
N = int(input()) # X = 영수증에 적힌 물건 종류의 수 

A=0

for i in range(N):
    a,b = map(int, input().split()) # a = 물건의 가격, b = 물건의 개수 
    A += a*b 

if(X==A):
    print("Yes")
else:
    print("No")

📕 빠른 A+B

BAEKJOON 빠른 A+B

문제

입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

코드

import sys

N = int(input())

# (1)
for i in range(N):
    x, y = map(int, sys.stdin.readline().split())
    print(x+y)

# (2)
a = [map(int, sys.stdin.readline().split()) for i in range(N)]

for x, y in a:
    print(x+y)

📕 별 찍기 - 2

BAEKJOON 별 찍기 - 2별 찍기 - 2

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

코드

N = int(input())

for i in range(1,N+1):
    print(' '*(N-i)+"*"*i) # ,로 연결하면 공백 생겨 + 사용해 문자열로 만듦

📕 더하기 사이클

BAEKJOON 더하기 사이클

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

코드

N = int(input())

len=0
new = -1

while N!=new:
    if(new == -1):
        new = N
    new = new%10*10+(new//10+new%10)%10  # 조건 만족하는 식 생성 
    len += 1    # 길이 측정 

print(len)

📍 4. 1차원 배열

📕 개수 세기

BAEKJOON 개수 세기

문제

총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.

코드

N = int(input()) # 정수의 개수 
arr = list(map(int, input().split()[:N])) # 배열
sel = int(input()) # 찾을 정수 

# count함수 사용
print(arr.count(sel))

📕 X보다 작은 수

BAEKJOON X보다 작은 수

문제

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

코드

N, X = map(int, input().split())
arr = list(map(int, input().split()))

for i in range(N):
    if arr[i] < X:
        print(arr[i], end=" ")

📕 최댓값

BAEKJOON 최댓값

문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

코드

arr = []

for _ in range(9):
    arr.append(int(input()))

print(max(arr))
print(arr.index(max(arr))+1)

📕 과제 안 내신 분..?

BAEKJOON 과제 안 내신 분..?

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오

코드

arr = [i for i in range(1, 31)]

for _ in range(28):
    N = int(input())
    arr.remove(N)


print(min(arr))
print(max(arr))

📕 나머지

BAEKJOON 나머지

문제

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

코드

arr = []

for _ in range(10):
    arr.append(int(input()) % 42)

setarr = set(arr)
print(len(setarr))

📕 OX퀴즈

BAEKJOON OX퀴즈

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

코드

N = int(input())

for _ in range(N):
    arr = list(input())
    score = 0
    sum_score = 0
    for i in arr:
        if i == 'O':
            score += 1
            sum_score += score
        else:
            score = 0
    print(sum_score)

📕 평균은 넘겠지

BAEKJOON 평균은 넘겠지

문제

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

코드

C = int(input())

for _ in range(C):
    arr = list(map(int, input().split()))
    avg = sum(arr[1:]) / arr[0]

    N = 0
    for i in arr[1:]:
        if i > avg:
            N += 1

    answer = (N / arr[0]) * 100
    print('%.3f'% answer + '%')

📍 함수

📕 정수 N개의 합

BAEKJOON 정수 N개의 합

문제

정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오.

코드

def solve (a):
    return sum(a)

📕 셀프 넘버

BAEKJOON 셀프 넘버

문제

셀프 넘버는 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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

코드

number = list(range(1, 10001))
create = []

for num in number:
    for n in str(num):
        num += int(n)

    if num <= 10000:
        create.append(num)

for create in set(create):
    number.remove(create)

for i in number:
    print(i)

풀이

  1. 생성자 리스트 선언 (crate = [])
  2. 숫자를 각 자리수 분산하기 위해 str 변환 + num 값에 각 자리수 더함
  3. 10000 보다 작으면 생성자 리스트에 추가
  4. 중복된 숫자 정리하기 위해 set 이용 (set(create))
  5. number 리스트에서 생성자 리스트 제거

📖출처📖

백준 python

profile
Notion으로 이동 (https://24tngus.notion.site/3a6883f0f47041fe8045ef330a147da3?v=973a0b5ec78a4462bac8010e3b4cd5c0&pvs=4)

0개의 댓글