728x90

(1) 문제

  • 요세푸스 문제는 다음과 같다.
  • 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.
  • N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

(2) 입력

  • 첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

(3) 출력

  • 예제와 같이 요세푸스 순열을 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys
N, K = map(int,sys.stdin.readline().split())

player_list = []
for i in range(N):
    player_list.append(i + 1)

cur_index = 0

print('<', end='')
while True:
    cur_index = (cur_index + K - 1) % len(player_list)
    print(player_list.pop(cur_index), end= '')
    if not player_list:
        break
    print(', ',end='')
print('>')

(6) 실행결과


반응형
728x90

(1) 문제

  • 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
  • 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

 


(2) 입력

  • 첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

 


(3) 출력

  • 첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

(4) 예제 입력 및 출력


(5) 코드

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

cur_num = 0

while True:
    cur_num += 1
    temp_num = cur_num
    temp_num_sum = 0

    while temp_num != 0:
        temp_num_sum += temp_num % 10
        temp_num = temp_num // 10
        
    temp_num_sum += cur_num
    
    if temp_num_sum == number:
        print(cur_num)
        break
    elif cur_num > number:
        print(0)
        break

(6) 실행결과


반응형
728x90

(1) 문제

  • 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.
  • 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.
  • 김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.
  • 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.
  • N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

(2) 입력

  • 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.
  • 합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

 


(3) 출력

  • 첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys

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

length = int(length)
max_sum = int(max_sum)

max_sum_three = 0

for i in range(length - 2):
    for j in range(i + 1, length - 1, 1):
        for k in range(j + 1, length, 1):
            temp_sum = cards[i] + cards[j] + cards[k]
            if temp_sum >= max_sum_three and temp_sum <= max_sum:
                max_sum_three = temp_sum
            
        
print(max_sum_three)

(6) 실행결과


반응형
728x90

(1) 문제

  • 조규현과 백승환은 터렛에 근무하는 직원이다. 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다. 다음은 조규현과 백승환의 사진이다.

  • 이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.
  • 조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.

(2) 입력

  • 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다.
  • 한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.

(3) 출력

  • 각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

 


(4) 예제 입력 및 출력


(5) 코드

import sys
import math

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

def able_to_exist_count(x1, x2, y1, y2, r1, r2):
    distance = math.sqrt((x2 - x1) ** 2 + (y2 - y1) **2)

    if x1 == x2 and y1 == y2 and r1 == r2:
        return -1

    if distance > r1 + r2:
        return 0
    elif distance == r1 + r2:
        return 1
    elif distance < r1 + r2 and distance + min(r1, r2) == max(r1, r2):
        return 1
    elif distance < r1 + r2 and distance + min(r1, r2) > max(r1, r2):
        return 2
    else:
        return 0



for i in range(length):
    input_list = list(map(int, sys.stdin.readline().split()))
    
    x1 = input_list[0]
    x2 = input_list[3]

    y1 = input_list[1]
    y2 = input_list[4]

    r1 = input_list[2]
    r2 = input_list[5]

    print(able_to_exist_count(x1, x2, y1, y2, r1, r2))

(6) 실행결과


반응형
728x90

(1) 문제

  • 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다.

  • 예를 들어 <그림 2>와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다.

  • 계단 오르는 데는 다음과 같은 규칙이 있다.
    1. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.
    2. 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.
    3. 마지막 도착 계단은 반드시 밟아야 한다.
  • 따라서 첫 번째 계단을 밟고 이어 두 번째 계단이나, 세 번째 계단으로 오를 수 있다. 하지만, 첫 번째 계단을 밟고 이어 네 번째 계단으로 올라가거나, 첫 번째, 두 번째, 세 번째 계단을 연속해서 모두 밟을 수는 없다.

각 계단에 쓰여 있는 점수가 주어질 때 이 게임에서 얻을 수 있는 총 점수의 최댓값을 구하는 프로그램을 작성하시오.

 


(2) 입력

  • 입력의 첫째 줄에 계단의 개수가 주어진다.
  • 둘째 줄부터 한 줄에 하나씩 제일 아래에 놓인 계단부터 순서대로 각 계단에 쓰여 있는 점수가 주어진다. 계단의 개수는 300이하의 자연수이고, 계단에 쓰여 있는 점수는 10,000이하의 자연수이다.

 


(3) 출력

  • 첫째 줄에 계단 오르기 게임에서 얻을 수 있는 총 점수의 최댓값을 출력한다.

(4) 예제 입력 및 출력


(5) 코드

import sys

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

stair_score = []

for _ in range(length):
    stair_score.append(int(sys.stdin.readline()))

dp = []
if len(stair_score) > 2:
    dp.append(stair_score[0])
    dp.append(stair_score[0] + stair_score[1])
    dp.append(max(stair_score[0] + stair_score[2], stair_score[1] + stair_score[2]))

    for i in range(3,length): 
        dp.append(max(dp[i-2] + stair_score[i] , dp[i-3] + stair_score[i] + stair_score[i - 1]))

if len(stair_score) == 0:
    print(-1)
elif len(stair_score) == 1:
    print(stair_score[0])
elif len(stair_score) == 2:
    print(stair_score[0] + stair_score[1])
else:
    print(dp[-1])

(6) 실행결과


반응형
728x90

(1) 문제

  • 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
    • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
    • 고른 수열은 오름차순이어야 한다.

(2) 입력

  • 첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

 


(3) 출력

  • 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
  • 수열은 사전 순으로 증가하는 순서로 출력해야 한다.

 


(4) 예제 입력 및 출력


(5) 코드

import itertools
import sys
N, M = map(int,sys.stdin.readline().split())

N_list = []
for i in range(N):
    N_list.append(str(i + 1))

for i in list(map(' '.join, itertools.combinations(N_list, M))):
    print(i)

(6) 실행결과


반응형
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) 실행결과


반응형

+ Recent posts