728x90
반응형

11/ 01 파이썬 공부
1. 백준 10845번 큐

1) 문제
정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 여섯 가지이다.

-push X: 정수 X를 큐에 넣는 연산이다.
-pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
-size: 큐에 들어있는 정수의 개수를 출력한다.
-empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
-front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
-back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

2) 입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 
둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 
주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 
문제에 나와있지 않은 명령이 주어지는 경우는 없다.

3) 출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

>>>코드

import sys

queue = []
for _ in range(int(sys.stdin.readline())):
    command = sys.stdin.readline().split()
    if command[0] == 'push':
        queue.append(command[1])
    elif command[0] == 'pop':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[0])
            del queue[0]
    elif command[0] == 'size':
        print(len(queue))
    elif command[0] == 'empty':
        if len(queue) == 0:
            print(1)
        else:
            print(0)
    elif command[0] == 'front':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[0])
    elif command[0] == 'back':
        if len(queue) == 0:
            print(-1)
        else:
            print(queue[-1])



입력된 단어에 따라 리스트를 수정하고, 출력하는 방식으로 큐을 구현했다.

- 큐 (선입선출)
기본적인 자료 구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식을 말한다. 영어 단어 queue는 표를 사러 일렬로 늘어선 사람들로 이루어진 줄을 말하기도 하며, 먼저 줄을 선 사람이 먼저 나갈 수 있는 상황을 연상하면 된다.

- 문제 링크
https://www.acmicpc.net/problem/10845

728x90
반응형
728x90
반응형

10/ 31 파이썬 공부
1. 백준 10828번 스택

1) 문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.

- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

2) 입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 
둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 
주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 
문제에 나와있지 않은 명령이 주어지는 경우는 없다.

3) 출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

>>>코드

import sys

stack = []
for _ in range(int(sys.stdin.readline())):
    command = sys.stdin.readline().split()
    if command[0] == 'push':
        stack.append(command[1])
    elif command[0] == 'pop':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[-1])
            del stack[-1]
    elif command[0] == 'size':
        print(len(stack))
    elif command[0] == 'empty':
        if len(stack) == 0:
            print(1)
        else:
            print(0)
    elif command[0] == 'top':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[-1])



입력된 단어에 따라 리스트를 수정하고, 출력하는 방식으로 스택을 구현했다.

 

- 스택 (후입선출)
스택(stack)은 제한적으로 접근할 수 있는 나열 구조이다. 
그 접근 방법은 언제나 목록의 끝에서만 일어난다. 끝먼저내기 목록(Pushdown list)이라고도 한다.

스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있다. 
자료를 넣는 것을 '밀어넣는다' 하여 푸쉬(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 푸쉬한 자료부터 나오게 된다. 
이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 한다.

- 문제 링크
https://www.acmicpc.net/problem/10828

728x90
반응형
728x90
반응형

10/ 30 파이썬 공부
1. 백준 10814번 나이순 정렬
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 
나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 
길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 
나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

>>>코드1: 정답이긴 한데 속도가 너무 느림

l = []
for i in range(int(input())):
    n, name = input().split()
    n = int(n)
    l.append((n, name))
result = sorted(l, key = lambda l: l[0])
for i in range(len(result)):
    print(result[i][0], result[i][1])



보수해보도록 하자

>>>코드2

import sys
# 나이와 이름을 입력받을 리스트 생성
l = []
# 나이와 이름 입력받은 후 2차원 리스트로 입력받기
for i in range(int(input())):
    n, name = sys.stdin.readline().split()
    n = int(n)
    l.append((n, name))
# 나이만을 기준으로 분류한 새로운 리스트 생성
result = sorted(l, key = lambda l: l[0])
# 출력하기
for i in range(len(result)):
    print(result[i][0], result[i][1])



확실히 import sys를 사용하니 빠르다.

- 문제 링크
https://www.acmicpc.net/problem/10814

728x90
반응형
728x90
반응형

10/ 29 파이썬 공부
1. 백준 1181번 단어 정렬
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

길이가 짧은 것부터
길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 
둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 
주어지는 문자열의 길이는 50을 넘지 않는다.
조건에 따라 정렬하여 단어들을 출력한다.

>>>코드

# 문자를 입력 받을 리스트 생성
l = []
# 문자 입력 받기
for _ in range(int(input())):
    word = input()
    l.append((word))
# set 함수로 중복 없애기
l = set(l)
# sorted, lambda 함수를 이용해서 첫번째로는 길이로 다음으로는 순서를 기준으로 오름차순 정렬
result = sorted(l, key = lambda l: (len(l), l))
# 순서대로 출력
for i in range(len(result)):
    print(result[i])


sorted 함수와 lambda로 데이터를 기준에 따라 분류하는 문제이다.

728x90
반응형
728x90
반응형

10/ 28 파이썬 공부
1. 백준 2163번 초콜릿 자르기
정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 
초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다.

초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 
이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 
초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 
초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 
이와 같이 초콜릿을 쪼개면 초콜릿은 두 개의 조각으로 나눠지게 된다. 
이제 다시 이 중에서 초콜릿 조각을 하나 들고, 쪼개는 과정을 반복하면 된다.

초콜릿을 쪼개다보면 초콜릿이 녹을 수 있기 때문에, 
정화는 가급적이면 초콜릿을 쪼개는 횟수를 최소로 하려 한다. 
초콜릿의 크기가 주어졌을 때, 
이를 1×1 크기의 초콜릿으로 쪼개기 위한 최소 쪼개기 횟수를 구하는 프로그램을 작성하시오.

첫째 줄에 두 정수 N, M(1 ≤ N, M ≤ 300)이 주어진다.
첫째 줄에 답을 출력한다.

>>>코드

n, m = map(int, input().split())
print(n*m-1)



규칙을 찾는 문제인거 같다.

코드 자체는 안어려운 편

728x90
반응형
728x90
반응형

10/ 27 파이썬 공부
1. 백준 5656번 비교 연산자
C언어의 비교 연산자는 아래 표에 나와있다. 

연산자 
> 크다
>= 크거나 같다
<  작다
<= 작거나 같다
== 같다
!= 같지 않다


이 연산자는 두 피연산자를 비교하고, (왼쪽 값과 오른쪽 값) true또는 false (1 또는 0)을 리턴한다. 
예를 들어, 2 > 3은 "false"를 리턴하고 (2는 3보다 작기 때문), 
3 != 4는 "true", 3 >= 3은 "true"를 리턴한다.
C언어의 비교 연산식이 주어졌을 때, 결과를 구하는 프로그램을 작성하시오.

입력은 최대 12000줄로 이루어져 있다. 각 줄은 두 정수 a, b가 주어지며, 정수 사이에는 연산자 ">", ">=", "<", "<=", "==", "!="중 하나가 주어진다. 연산자와 피연산자 사이에는 공백이 하나 있으며, 연산자로 "E"가 주어진 경우에는 프로그램을 끝낸다. (-10000 ≤ a,b ≤ 10000)
입력의 각 줄 마다 입력으로 주어진 식의 결과가 "true"인지 "false"인지 출력한다.

>>>코드

i = 1
while True:
    equation = input() # 식을 문자열로 입력받기
    if 'E' in equation: # 만약 E가 문자열 속에 존재할 경우 break
        break
    else:
        if eval(equation) == True: # 식이 참일 경우
            print('Case %d: true' %(i))
        else: # 식이 거짓일 경우
            print('Case %d: false' %(i))
        i += 1


전에 배운 eval 함수를 이용하여 간단하게 풀었다.

728x90
반응형
728x90
반응형

10/ 26 파이썬 공부
1. 백준 2592번 대표값
어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 
평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 
예를 들어 10, 40, 30, 60, 30, 20, 60, 30, 40, 50의 평균은 
(10 + 40 + 30 + 60 + 30 + 20 + 60 + 30 + 40 + 50) / 10 = 370 / 10 = 37이 된다.

평균 이외의 또 다른 대표값으로 최빈값이라는 것이 있다. 
최빈값은 주어진 수들 가운데 가장 많이 나타나는 수이다. 
예를 들어 10, 40, 30, 60, 30, 20, 60, 30, 40, 50이 주어질 경우, 
30이 세 번, 40과 60이 각각 두 번, 10, 20, 50이 각각 한 번씩 나오므로, 최빈값은 30이 된다.

열 개의 자연수가 주어질 때 이들의 평균과 최빈값을 구하는 프로그램을 작성하시오.

첫째 줄부터 열 번째 줄까지 한 줄에 하나씩 자연수가 주어진다. 
주어지는 자연수는 1,000 보다 작은 10의 배수이다.
첫째 줄에는 평균을 출력하고, 둘째 줄에는 최빈값을 출력한다. 
최빈값이 둘 이상일 경우 그 중 하나만 출력한다. 평균과 최빈값은 모두 자연수이다.

>>>코드

l = [] # 평균 계산용 리스트
c = [0] * 1001 # 최빈값 카운트용 리스트
for i in range(10):
    n = int(input())
    l.append(n)
    c[n] += 1
print(sum(l)//10) # 평균 출력
print(c.index(max(c))) # 최빈값(카운트한 리스트의 인덱스) 출력
728x90
반응형
728x90
반응형

10/ 25 파이썬 공부
1. 백준 2774 아름다운 수
윤정이는 뭐든지 아름다운 것이 좋다고 생각한다. 
그래서 윤정이는 사물을 볼 때 자신이 정한 방법으로 아름다운 정도를 평가한다. 
윤정이는 수를 볼 때도 이런 아름다운 수의 정도를 따지는데, 
윤정이에게 있어서 아름다운 수의 정도는 그 수를 이루고 있는 10진수의 서로 다른 숫자의 개수를 의미한다.  
예를 들어 122이라는 수는 1과 2 라는 2개의 숫자로 이루어져 있으므로 아름다운 정도가 2가 된다. 
윤정이의 방법으로 여러 수들의 아름다운 정도를 알아보자.

첫째 줄에는 테스트 케이스의 개수 T가 주어진다. 
다음 줄부터는 아름다운 정도를 알고 싶은 수 X(1 ≤ X ≤ 1000000000)가 주어진다.
각각의 테스트 케이스마다 X의 아름다운 정도를 한 줄에 하나씩 입력으로 주어진 순서대로 출력한다.

>>>코드

for i in range(int(input())):
    n = set(input())
    print(len(n))



set 함수는 중복을 없애준다.

728x90
반응형

+ Recent posts