728x90
반응형

10/ 24 파이썬 공부
1. 백준 2408 큰 수 계산
어떤 임의의 수식이 입력으로 들어올때 수식을 계산하는 프로그램을 짜시오. 
수의 크기는 -10^(100) 이상 10^(100)이하이고, 수식에 괄호는 없다.
소수점이 나올 경우, 소수점은 내린다. 참고로, -5/2 = -3이고, 5/-2도 -3이다. -5/-2는 2이다.

수의 개수 N(1 ≤ N ≤ 10) 이 주어지고 다음 2N-1 개의 줄에는 수와 연산자(+, -, *, /) 가 번갈아서 들어온다. 첫째 줄에 계산이 끝난 후 수를 출력한다.

>>>코드1 : 리스트 입력 후 곱셈, 나눗셈 먼저 처리 후 덧셈 뺼셈 처리하기

# 수의 개수 입력
n = int(input())
# 전체 식을 리스트로 만들기
l = []
i = 0
while i < 2*n-1:
    m = input()
    # 짝수번째면 숫자 입력받기
    if i%2 == 0:
        l.append(int(m))
    # 홀수번째면 기호 입력받기
    else:
        # 만약 기호가 곱셈이면 마지막 숫자와 새로 입력할 숫자를 곱해서 마지막 리스트를 수정하기
        if m == '*':
            k = int(input())
            l[-1] = l[-1] * k
            i += 1
        # 만약 기호가 나눈셈이면 마지막 숫자와 새로 입력할 숫자를 나누어서 마지막 리스트를 수정하기
        elif m == '/':
            k = int(input())
            l[-1] = l[-1] // k
            i += 1
        # 기호가 덧셈이나 나눗셈이면 그냥 리스트에 추가하기
        else:
            l.append(m)
    i += 1
result = l[0]
# 덧셈 나눗셈 계산하기
for i in range(1, len(l), 2):
    if l[i] == '+':
        result += l[i+1]
    elif l[i] == '-':
        result -= l[i+1]
# 결과 출력하기
print(result)



그런데 이렇게 하는게 아니였던 것 같다.

>>> 코드 2: eval 함수 사용하기

equation = ''
for i in range(int(input())*2-1):
    n = input()
    if n == '/':
        equation += '//'
    else:
        equation += n
print(eval(equation))



>>>코드 설명
- eval() 함수
매개변수로 받은 expression (= 식)을 문자열로 받아서 실행하는 함수이다.

예를 들어 
eval("2 + 1")
이 입력되면 3을 반환하는 자동 계산 함수이다.

728x90
반응형
728x90
반응형

10/ 22 파이썬 공부
1. 백준 28214 크림빵
KOI 빵집에서는 크림을 넣은 빵을 판다. KOI 빵집은 총 N * K개의 빵을 만들었다. 
KOI 빵집은 일렬로 놓여 있는 빵을 앞에서부터 순서대로 K개씩 묶어서 한 묶음으로 판매할 것이다. 
즉, 총 N개의 빵 묶음이 있다.

하지만 빵을 급하게 만드는 바람에, 빵 중 일부에는 크림이 들어있지 않다. 
만약 크림이 없는 빵이 한 묶음에 P개 이상 있다면 그 묶음은 팔 수 없다. 
다시 말해, 빵 묶음은 K개의 빵 중 크림이 없는 빵이 P개 미만이어야 팔 수 있다.
각 빵에 크림이 들어 있는지에 대한 정보가 주어진다. 이 때 팔 수 있는 빵 묶음의 수를 출력하여라.

첫 번째 줄에 N, K, P가 공백을 하나 사이에 두고 주어진다.
두 번째 줄에는 앞쪽에 놓여있는 빵부터 순서대로 빵에 크림이 들어 있는지를 나타내는 정수가 공백을 사이에 두고 주어진다. 만약 0이 주어진다면 빵에 크림이 없는 것이고, 1이 주어진다면 빵에 크림이 있는 것이다.
첫 번째 줄에 팔 수 있는 빵 묶음의 수를 출력한다.

>>>코드

n, k, p = map(int, input().split())
l = list(map(int, input().split()))
i, r = 0, 0
while i < len(l):
    if sum(l[i: i+k]) > k-p:
        r += 1
    i += k
print(r)



크림이 들어있는 경우를 1로 표기하는 덕분에 크림이 든 빵의 개수를 sum()함수를 이용해 셀 수 있었다.
슬라이싱 후 더해주고 조건문을 이용해서 해당 조건이 가능한지 검사하면 된다.

728x90
반응형
728x90
반응형

10/ 21 파이썬 공부
1. 백준 2751 수 정렬하기 2
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 
둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 
수는 중복되지 않는다.
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

>>> 코드 시도 1

l = []
for i in range(int(input()):
    l.append(int(input())
l.sort()
for i in range(len(l)):
     print(l[i])



역시 '수 정렬하기'에서 사용한 코드로는 한계가 있다.
메모리 초과는 안나오지만, 시간 초과가 나온다.

그렇다면 import sys
sys.stdin.readline()을 사용해보자

>>> 코드 2

import sys
l =[]
for i in range(int(sys.stdin.readline())):
    l.append(int(sys.stdin.readline()))
l.sort()
for i in range(len(l)):
    print(l[i])



정답이다.

728x90
반응형
728x90
반응형

10/ 20 파이썬 공부
1. 백준 10989 수 정렬하기 3
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 
둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

>>> 코드 시도 1

l =[]
for i in range(int(input())):
    l.append(int(input()))
l.sort()
for i in range(len(l)):
    print(l[i])



이전 '수 정렬하기' 문제에서 하던대로 코드를 짜보았으나 메모리 초과가 떴다.
다른 방식을 생각해보야아 할듯하다.
메모리 제한은 8MB.
아마도 수의 개수가 10,000,000이 최대다 보니, 길이가 10,000,000인 리스트가 메모리를 잡아먹는 듯 하다.
길이를 줄여보자.

>>> 코드 정답 1

import sys
l = [0] * 10000
for i in range(int(sys.stdin.readline())):
    n = int(sys.stdin.readline())
    l[n-1] += 1
for i in range(len(l)):
    if l[i] != 0:
        for j in range(l[i]):
            print(i+1)



>>> 코드 설명
숫자 제한이 1 <= n <= 10000 이기 때문에 value가 0 이고 길이가 10000인 리스트를 만들어 준다.
그리고 숫자가 입력되면 해당 숫자 인덱스의 value를 +1 해서 숫자를 카운트한다.
마지막에 리스트의 value만큼 해당 리스트를 출력한다.

728x90
반응형
728x90
반응형

10/ 19 파이썬 공부
1.백준 2839 설탕 배달
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 
상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 
설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 
예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 
5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 
봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)
상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

>>>코드 1: 1의 자리 수에 따른 경우 고려하기
n = int(input())
m = n % 10
if m == 0:
    print(n//5)
elif m == 1:
    if n < 11:
        print(-1)
    else:
        print(2 + (n-6)//5)
elif m == 2:
    if n < 12:
        print(-1)
    else:
        print(4 + (n-12)//5)
elif m == 3:
    print(1 + (n-3)//5)
elif m == 4:
    if n < 14:
        print(-1)
    else:
        print(3 + (n-9)//5)
elif m == 5:
    print(n//5)
elif m == 6:
    print(2 + (n-6)//5)
elif m == 7:
    if n < 17:
        print(-1)
    else:
        print(4 + (n-12)//5)
elif m == 8:
    print(1 + (n-3)//5)
else:
    print(3 + (n-9)//5)

>>>코드 설명
경우의 수 나누기

1의자리수 -> 나올 수 있는 최소의 값
0 -> 5*2
1 -> 5 + 3*2
2 -> 3*4
3 -> 3
4 -> 5 + 3*3
5 -> 5
6 -> 3*2
7 -> 5 + 3*4
8 -> 5 + 3
9 -> 3*3


흠 너무 길다.
다른 방법을 찾아보자

>>>코드 2: 5로 나눠질 때까지 3을 빼보자.
n = int(input())
if n % 5 == 0:
    print(n // 5)
else:
    p = 0
    while n > 0:
        n -= 3
        p += 1 # 3으로 나눈 수 카운트
        if n % 5 == 0: # 3을 p번 빼서 5로 나누어지는 경우
            print(p + n // 5)
            break
        elif n == 1 or n == 2: # 결국 다 뺄때 까지 안나눠진 경우
            print(-1)
            break
        elif n == 0: # 3으로만 나누어진 경우
            print(p)
            break

흠 훨씬 짧고 깔끔해졌다.

728x90
반응형
728x90
반응형

10/ 18 파이썬 공부
1. 백준 29766 DKSH 찾기
학교의 로고인 DKSH는 Dankook University Software High School의 약자이다.
D, K, S, H로만 이루어진 문자열이 주어진다. 이 문자열에서 DKSH가 몇 번 나타나는지 구해보자.

첫째 줄에 문자열이 입력된다. 문자열의 길이는 1,000을 넘지 않는다.
첫째 줄에 입력된 문자열에서 DKSH가 몇 번 나타나는지 출력한다.

>>>코드

n = input()
m = 0
for i in range(len(n)-3):
    if n[i:i+4] == 'DKSH':
        m += 1
print(m)


슬라이싱해서 개수 세기

728x90
반응형
728x90
반응형

10/ 17 파이썬 공부
1. 백준 30031 지폐세기
대한민국 지폐는 천 원권, 오천 원권, 만 원권, 오만 원권으로 총 네 종류가 있다. 
각 지폐의 세로 길이는 68mm로 모두 같지만, 가로 길이는 모두 다르다. 
천 원권의 가로 길이는 136mm, 오천 원권의 가로 길이는 142mm, 만 원권의 가로 길이는 148mm, 오만 원권의 가로 길이는 154mm이다. 따라서 가로의 길이를 통해서 지폐의 종류를 구분할 수 있다.

수민이는 대한민국 지폐 N장을 가지고 있다. 
수민이는 종이의 크기를 재는 기계를 이용하여 각 지폐의 가로, 세로 길이를 알아냈다. 
수민이가 가진 지폐의 총액을 구해보자.

첫째 줄에 정수 N(1 <= N <= 100)이 주어진다.
둘째 줄부터 N개의 줄에 각 지폐의 가로, 세로 길이가 공백으로 구분되어 mm단위로 주어진다. 주어지는 지폐의 가로, 세로 길이의 길이는 정수이고 천 원권, 오천 원권, 만 원권, 오만 원권의 가로, 세로 길이 중 하나이다.
수민이가 가진 지폐의 총액을 출력한다.

>>>코드

r = 0
for _ in range(int(input())):
    n, m = map(int, input().split())
    if n == 136:
        r += 1000
    elif n == 142:
        r += 5000
    elif n == 148:
        r += 10000
    else:
        r += 50000
print(r)


간단한 조건 반복문 문제
세로 길이는 같으니 가로 길이만 분류하면 끝.

728x90
반응형
728x90
반응형

10/ 16 파이썬 공부
1. 백준 30017 치즈버거 만들기
승현이가 일하는 햄버거 가게에는 요리 재료로 사용할 햄버거 패티가 A개, 슬라이스 치즈가 B개 있다. 치즈버거를 만들기 위해서는 패티와 치즈를 각각 한 개 이상 고른 후 햄버거 빵 사이에 패티와 치즈를 번갈아 쌓아야 한다. 단, 패티의 개수는 치즈의 개수보다 정확히 한 개 더 많이 골라야 한다.
승현이는 가게에 있는 요리 재료를 가지고 최대한 큰 치즈버거를 하나 만들려고 한다. 
치즈버거의 크기는 패티와 치즈의 개수를 더한 것과 같다. 
승현이가 만들 수 있는 치즈버거의 최대 크기를 구해보자.

첫째 줄에 패티의 개수 A(2 <= A <= 100)와 치즈의 개수 B(1 <= B <= 100)가 공백으로 구분되어 주어진다.
승현이가 만들 수 있는 치즈버거의 최대 크기를 출력한다.

>>>코드

A, B = map(int, input().split())
if A > B:
    print(2*B+1)
else:
    print(2*A-1)



경우의수 2가지
- 패티가 많은경우: 치즈 개수 * 2 +1
- 치즈가 많은경우: 패티 개수 * 2 -1

728x90
반응형

+ Recent posts