728x90

(1) 문제

  • 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 
  • 여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 

 


(2) 입력

  • 입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 

(3) 출력

  • 출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다. 

 


(4) 예제 입력 및 출력


(5) 코드

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

def is_VPS(string):
    stack = []
    
    for char in string:
        if char == '(':
            stack.append(char)
        elif char == ')':
            if stack:
                if stack[-1] == '(':
                    stack.pop()
                else:
                    return 'NO'
            else:
                return 'NO'
    if stack:
        return 'NO'
    else:
        return 'YES'


for i in range(length):
    string = sys.stdin.readline()
    print(is_VPS(string))

(6) 실행결과


반응형
728x90

(1) 문제

  • 나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.
  • 재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.
  • 재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.
  • 재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!

 


(2) 입력

  • 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000)
  • 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.
  • 정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.

 


(3) 출력

  • 재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.

 


(4) 예제 입력 및 출력


(5) 코드

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

stack = []

for i in range(length):
    num = int(sys.stdin.readline())
    if num == 0:
        stack.pop()
    else:
        stack.append(num)

print(sum(stack))

(6) 실행결과


반응형
728x90

(1) 문제

  • 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
  • 명령은 총 다섯 가지이다.
    • push X: 정수 X를 스택에 넣는 연산이다.
    • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • size: 스택에 들어있는 정수의 개수를 출력한다.
    • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
    • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

 


(2) 입력

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

 


(3) 출력

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

 


(4) 예제 입력 및 출력


(5) 코드

import sys

length = int(sys.stdin.readline())
stack = []

def command(command_list):
    if len(command_list) == 1:        
        if command_list[0] == 'empty':
            return 0 if stack else 1
        if command_list[0] == 'size':
            return len(stack)
        if stack:       
            if command_list[0] == 'pop':
                return stack.pop()
            if command_list[0] == 'top':
                return stack[-1]
        else:
            return -1
    elif len(command_list) == 2:
        if command_list[0] == 'push':
            stack.append(command_list[1])

for i in range(length):
    command_list = list(sys.stdin.readline().split())    
    result = command(command_list)
    if result is not None:
        print(result)

(6) 실행결과


반응형
728x90

(1) 문제

  • 재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ M)
  • 재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지을 수 있는 경우의 수를 구하는 프로그램을 작성하라.

 


(2) 입력

  • 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

(3) 출력

  • 각 테스트 케이스에 대해 주어진 조건하에 다리를 지을 수 있는 경우의 수를 출력한다.

(4) 예제 입력 및 출력


(5) 코드

import sys
import math

def factorial(num):
    result = 1
    for i in range(1,num + 1):
        result *= i
    return result

length = int(sys.stdin.readline())

for i in range(length):
    left,right = map(int, sys.stdin.readline().split())
    print(factorial(right) // factorial(left) // factorial(right - left))

(6) 실행결과


반응형
728x90

(1) 문제

  • 자연수 N과 정수 K가 주어졌을 때 이항 계수 (NK)를 구하는 프로그램을 작성하시오.

(2) 입력

  • 첫째 줄에 N K가 주어진다. (1 ≤ N ≤ 10, 0 ≤ K  N)

 


(3) 출력

  • (NK)를 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys
import math

n,r = map(int, sys.stdin.readline().split())

def factorial(num):
    result = 1
    for i in range(1,num + 1):
        result *= i
    return result

print(int(factorial(n) / (factorial(n - r) * factorial(r))))

(6) 실행결과


반응형
728x90

(1) 문제

  • 두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다.
  • 두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.

 


(2) 입력

  • 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 둘째 줄부터 T개의 줄에 걸쳐서 A와 B가 주어진다. (1 ≤ A, B ≤ 45,000)

 


(3) 출력

  • 첫째 줄부터 T개의 줄에 A와 B의 최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import math
import sys

length = int(sys.stdin.readline())

for i in range(length):
    a,b = map(int, sys.stdin.readline().split())
    a_b_gcd = math.gcd(a,b)
    a_b_lcm = int(a * b / a_b_gcd)
    print(a_b_lcm)

(6) 실행결과


반응형
728x90

(1) 문제

  • 두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

(2) 입력

  • 첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

(3) 출력

  • 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import math
import sys

a,b = map(int, sys.stdin.readline().split())

a_b_gcd = math.gcd(a,b)
a_b_lcm = int(a * b / a_b_gcd)

print(a_b_gcd)
print(a_b_lcm)

(6) 실행결과


반응형
728x90

(1) 문제

  • 양수 A가 N의 진짜 약수가 되려면, N이 A의 배수이고, A가 1과 N이 아니어야 한다. 어떤 수 N의 진짜 약수가 모두 주어질 때, N을 구하는 프로그램을 작성하시오.

 


(2) 입력

  • 첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되지 않는다.

 


(3) 출력

  • 첫째 줄에 N을 출력한다. N은 항상 32비트 부호있는 정수로 표현할 수 있다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys

length = int(sys.stdin.readline())
divisor_list = list(map(int, sys.stdin.readline().split()))

divisor_list.sort()

print(divisor_list[0] * divisor_list[-1])

(6) 실행결과


반응형
728x90

(1) 문제

  • 인하은행에는 ATM이 1대밖에 없다. 지금 이 ATM앞에 N명의 사람들이 줄을 서있다. 사람은 1번부터 N번까지 번호가 매겨져 있으며, i번 사람이 돈을 인출하는데 걸리는 시간은 Pi분이다.
  • 사람들이 줄을 서는 순서에 따라서, 돈을 인출하는데 필요한 시간의 합이 달라지게 된다. 예를 들어, 총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필요하게 된다. 4번 사람은 3+1+4+3 = 11분, 5번 사람은 3+1+4+3+2 = 13분이 걸리게 된다. 이 경우에 각 사람이 돈을 인출하는데 필요한 시간의 합은 3+4+8+11+13 = 39분이 된다.
  • 줄을 [2, 5, 1, 4, 3] 순서로 줄을 서면, 2번 사람은 1분만에, 5번 사람은 1+2 = 3분, 1번 사람은 1+2+3 = 6분, 4번 사람은 1+2+3+3 = 9분, 3번 사람은 1+2+3+3+4 = 13분이 걸리게 된다. 각 사람이 돈을 인출하는데 필요한 시간의 합은 1+3+6+9+13 = 32분이다. 이 방법보다 더 필요한 시간의 합을 최소로 만들 수는 없다.
  • 줄을 서 있는 사람의 수 N과 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어졌을 때, 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구하는 프로그램을 작성하시오.

(2) 입력

  • 첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

 


(3) 출력

  • 첫째 줄에 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.

(4) 예제 입력 및 출력


(5) 코드

import sys

people = int(sys.stdin.readline())
time_list = list(map(int, sys.stdin.readline().split()))

min_time = sum(time_list)

while time_list:
    time_list.remove(max(time_list))
    min_time += sum(time_list)

print(min_time)

(6) 실행결과


 

반응형
728x90

(1) 문제

  • 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
  • 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

(2) 입력

  • 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
  • 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

 

(3) 출력

  • 첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

(4) 예제 입력 및 출력


(5) 코드

import sys
coin_kinds, price = map(int, sys.stdin.readline().split())

coin_kinds_list = []
for i in range(coin_kinds):
    coin_kinds_list.append(int(sys.stdin.readline()))

coin_count = 0

for i in range(coin_kinds - 1, -1, -1):
    cur_coin = coin_kinds_list[i]
    if price >= cur_coin:
        cur_coin_count = price // cur_coin
        coin_count += cur_coin_count
        price = price - (cur_coin * cur_coin_count)

print(coin_count)

(6) 실행결과


 

반응형

+ Recent posts