728x90

(1) 문제

  • 아래 <그림 1>과 같이 여러개의 정사각형칸들로 이루어진 정사각형 모양의 종이가 주어져 있고, 각 정사각형들은 하얀색으로 칠해져 있거나 파란색으로 칠해져 있다. 주어진 종이를 일정한 규칙에 따라 잘라서 다양한 크기를 가진 정사각형 모양의 하얀색 또는 파란색 색종이를 만들려고 한다.

  • 전체 종이의 크기가 N×N(N=2k, k는 1 이상 7 이하의 자연수) 이라면 종이를 자르는 규칙은 다음과 같다.
  • 전체 종이가 모두 같은 색으로 칠해져 있지 않으면 가로와 세로로 중간 부분을 잘라서 <그림 2>의 I, II, III, IV와 같이 똑같은 크기의 네 개의 N/2 × N/2색종이로 나눈다. 나누어진 종이 I, II, III, IV 각각에 대해서도 앞에서와 마찬가지로 모두 같은 색으로 칠해져 있지 않으면 같은 방법으로 똑같은 크기의 네 개의 색종이로 나눈다. 이와 같은 과정을 잘라진 종이가 모두 하얀색 또는 모두 파란색으로 칠해져 있거나, 하나의 정사각형 칸이 되어 더 이상 자를 수 없을 때까지 반복한다.
  • 위와 같은 규칙에 따라 잘랐을 때 <그림 3>은 <그림 1>의 종이를 처음 나눈 후의 상태를, <그림 4>는 두 번째 나눈 후의 상태를, <그림 5>는 최종적으로 만들어진 다양한 크기의 9장의 하얀색 색종이와 7장의 파란색 색종이를 보여주고 있다.

  • 입력으로 주어진 종이의 한 변의 길이 N과 각 정사각형칸의 색(하얀색 또는 파란색)이 주어질 때 잘라진 하얀색 색종이와 파란색 색종이의 개수를 구하는 프로그램을 작성하시오.

 


(2) 입력

  • 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. 하얀색으로 칠해진 칸은 0, 파란색으로 칠해진 칸은 1로 주어지며, 각 숫자 사이에는 빈칸이 하나씩 있다.

(3) 출력

  • 첫째 줄에는 잘라진 햐얀색 색종이의 개수를 출력하고, 둘째 줄에는 파란색 색종이의 개수를 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys
import math

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

square_list = []
square_store = []

count_zero = 0
count_one = 0

def is_zero_one(square_store, square_arrow_list):
    is_zero = False
    is_one = False
    global count_one
    global count_zero
    for row in square_arrow_list:
        if not is_one or not is_zero:
            if 1 in row:
                is_one = True
            if 0 in row:
                is_zero = True
        else:
            break

    if is_one and is_zero:
        square_store.append(square_arrow_list)
    elif not is_zero:
        count_one += 1
    else:        
        count_zero += 1

for i in range(square_length):
    square_list.append(list(map(int, sys.stdin.readline().split())))

is_zero_one(square_store, square_list)

while square_store:    
    square = square_store.pop(0)
    half_size = len(square) // 2

    square_left_up_list = []
    square_rigth_up_list = []
    square_left_down_list = []
    square_right_down_list = []

    for i in range(half_size):       
        temp_left_up_list = []
        temp_rigth_up_list = []
        temp_left_down_list = []
        temp_right_down_list = []

        for j in range(half_size):
            #왼쪽 위
            temp_left_up_list.append(square[i][j])
            #오른쪽 위
            temp_rigth_up_list.append(square[i][j + half_size])
            #왼쪽 아래
            temp_left_down_list.append(square[i + half_size][j])
            #오른쪽 아래
            temp_right_down_list.append(square[i + half_size][j + half_size])
    
        square_left_up_list.append(temp_left_up_list)
        square_rigth_up_list.append(temp_rigth_up_list)
        square_left_down_list.append(temp_left_down_list)
        square_right_down_list.append(temp_right_down_list)

    is_zero_one(square_store, square_left_up_list)
    is_zero_one(square_store, square_rigth_up_list)
    is_zero_one(square_store, square_left_down_list)
    is_zero_one(square_store, square_right_down_list)

print(count_zero)
print(count_one)

(6) 실행결과


반응형
728x90

(1) 문제

  • 수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
    • 산술평균 : N개의 수들의 합을 N으로 나눈 값
    • 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
    • 최빈값 : N개의 수들 중 가장 많이 나타나는 값
    • 범위 : N개의 수들 중 최댓값과 최솟값의 차이
  • N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

 


(2) 입력

  • 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

 


(3) 출력

  • 첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
  • 둘째 줄에는 중앙값을 출력한다.
  • 셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
  • 넷째 줄에는 범위를 출력한다.

(4) 예제 입력 및 출력


(5) 코드

import math
import sys

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

value_dictionary = {

}

value_list = []

for i in range(length):
    value = int(sys.stdin.readline())
    if value in value_dictionary:
        value_dictionary[value] += 1
    else:
        value_dictionary[value] = 1
    value_list.append(value)
    

sum_number = 0
max_frequency_list = []
max_frequency = 0

for number in value_dictionary:
    #덧셈 구하기
    sum_number += number * value_dictionary[number]
    
    #최빈값 구하기
    if max_frequency < value_dictionary[number]:
        max_frequency_list.clear()
        max_frequency = value_dictionary[number]
        max_frequency_list.append(number)

    elif max_frequency == value_dictionary[number]:
        max_frequency_list.append(number)
        
value_list.sort()
max_frequency_list.sort()

#산술평균
print(round(sum_number / length))
#중앙값
print(value_list[len(value_list) // 2])
#최빈값
if len(max_frequency_list) == 1:
    print(max_frequency_list[0])
else:
    print(max_frequency_list[1])
#최소, 최대 범위
print(value_list[-1] - value_list[0])

(6) 실행결과


반응형
728x90

(1) 문제

  • 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

 


(2) 입력

  • 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

(3) 출력

  • 첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys
import collections
point, line, start_point = map(int, sys.stdin.readline().split())

graph = {

}

def BFS(start_point, graph, check):
    queue = collections.deque([start_point])
    while queue:
        cur_value = queue.popleft()
        if check[cur_value]:
            continue
        else:
            check[cur_value] = True
            for cur_line in graph[cur_value]:
                if not check[cur_line]:
                    queue.append(cur_line)
            print(cur_value, end= ' ')

def DFS(start_point, graph, check):

    if check[start_point]:
        return
    else:
        print(start_point, end=' ')
        check[start_point] = True
        for cur_line in graph[start_point]:
            if not check[cur_line]:
                DFS(cur_line, graph, check)

for i in range(point):
    graph[i + 1] = []

for i in range(line):
    start, end = map(int, sys.stdin.readline().split())
    if start in graph:
        graph[start].append(end)
        graph[end].append(start)

for array in graph:
    graph[array].sort()

check = [False] * (point + 1)
DFS(start_point, graph, check)
print()
check = [False] * (point + 1)
BFS(start_point, graph, check)

(6) 실행결과


반응형
728x90

(1) 문제

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

 


(2) 입력

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

 


(3) 출력

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

(4) 예제 입력 및 출력


(5) 코드

import sys
import collections

length = int(sys.stdin.readline())
queue = collections.deque([])

def command(command_list):
    if len(command_list) == 1:        
        if command_list[0] == 'empty':
            return 0 if queue else 1
        if command_list[0] == 'size':
            return len(queue)
        if queue:       
            if command_list[0] == 'pop':
                return queue.popleft()
            if command_list[0] == 'back':
                return queue[-1]
            if command_list[0] == 'front':
                return queue[0]
        else:
            return -1
    elif len(command_list) == 2:
        if command_list[0] == 'push':
            queue.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) 문제

  • 괄호 문자열(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) 실행결과


반응형

+ Recent posts