반응형

파이썬 / BOJ 백준 / 10816 숫자 카드 2- Dictionary

https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.

 

문제 풀이

1. Dictionary를 이용하여 쉽게 풀 수 있는 문제입니다.

2. 해당 주소에 값이 있으면, 그 값에 +1을 해줍니다.

3. 해당 주소에 값이 없으면, 값을 추가합니다.

 

전체 코드

import sys

n = int(sys.stdin.readline().strip())
n_list = list(map(int, sys.stdin.readline().split()))
m = int(sys.stdin.readline().strip())
m_list = list(map(int, sys.stdin.readline().split()))

d = dict()
for i in n_list:
    if i in d.keys():
        d[i] += 1
    else:
        d[i] = 1

for i in m_list:
    if i in d.keys():
        print(d[i], end=' ')
    else:
        print(0, end=' ')

 

반응형
반응형

파이썬 / BOJ 백준 / 1920 수 찾기 - 이분 탐색

 

https://www.acmicpc.net/problem/1920

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

문제

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

 

 

문제 풀이

1. 이 문제는 이분 탐색 알고리즘을 이용하여 풀 수 있는 문제입니다.
(
하나씩 순차적으로 찾게 되면 시간초과가 됩니다.)

2. 우선 입력된 배열 N을 정렬시킵니다.

3. 시작과 끝 지점을 각각 leftright로 놓고, 중간 지점을 mid로 놓습니다.

4. mid에 위치한 값과 비교하여,
 4-1.
동일한 값이면, 1을 반환합니다.

 4-2. 값이 크면 leftmid + 1놓고, 다시 검색합니다.

 4-3. 값이 작으면 rightmid -1로 놓고, 다시 검색합니다.

 4-4. 원하는 값이 없으면, left 값이 right 값보다 크면 0을 반환합니다.

전체 코드

from sys import stdin

n = stdin.readline()
N = sorted(map(int,stdin.readline().split()))
m = stdin.readline()
M = map(int, stdin.readline().split())

def binary(value, left, right):
    print(value, left, right)
    if left > right:
        return 0
    mid = (left+right)//2
    if value == N[mid]:
        return 1
    elif value < N[mid]:
        return binary(value, left, mid-1)
    else:
        return binary(value, mid+1, right)

for v in M:
    left = 0
    right = len(N)-1
    print("v 입니다.")
    print(binary(v,left,right))

 

반응형
반응형

파이썬 / BOJ 백준 / 1780 종이의 개수 - 분할정복

 

https://www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수

www.acmicpc.net

 

문제

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다.

  1. 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다.
  2. (1)이 아닌 경우에는 종이를 같은 크기의 종이 9개로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다.

이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.

 

풀이

1. 이 문제는 분할정으로 풀 수 있는 문제입니다

2. 조건이 만족하지 않는 경우(색상이 모두 같은 경우가 아닌 경우)9개로 쪼개서 다시 푸는 방식입니다.

3. 9개로 쪼개는 것은 재귀 함수를 호출하여 풀고, 전달인자로 그 9개의 각각 종이 중 가장 왼쪽 위의 좌표와 크기를 넣습니다.

4. 조건이 만족하는 경우(하나의 색상으로만 구성되는 경우)는 해당 색상의 값을 +1해줍니다.

전체 코드

N = int(input())

board = [list(map(int, input().split())) for _ in range(N)]

result_minus = 0
result_zero = 0
result_plus = 0


def dfs(x, y, n):
    global result_minus, result_zero, result_plus

    num_check = board[x][y]
    for i in range(x, x + n):
        for j in range(y, y + n):
            if (board[i][j] != num_check):
                for k in range(3):
                    for l in range(3):
                        dfs(x + k * n // 3, y + l * n // 3, n // 3)
                return

    if num_check == -1:
        result_minus += 1
    elif num_check == 0:
        result_zero += 1
    else:
        result_plus += 1


dfs(0, 0, N)
print(f'{result_minus}\n{result_zero}\n{result_plus}')
반응형
반응형

파이썬 / BOJ 백준 / 1992 쿼드트리 - 분할정복

 

https://www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또

www.acmicpc.net

 

문제

흑백 영상을 압축하여 표현하는 데이터 구조로 쿼드 트리(Quad Tree)라는 방법이 있다. 흰 점을 나타내는 0과 검은 점을 나타내는 1로만 이루어진 영상(2차원 배열)에서 같은 숫자의 점들이 한 곳에 많이 몰려있으면, 쿼드 트리에서는 이를 압축하여 간단히 표현할 수 있다.
주어진 영상이 모두 0으로만 되어 있으면 압축 결과는 "0"이 되고, 모두 1로만 되어 있으면 압축 결과는 "1"이 된다. 만약 01이 섞여 있으면 전체를 한 번에 나타내지를 못하고, 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래, 이렇게 4개의 영상으로 나누어 압축하게 되며, 4개의 영역을 압축한 결과를 차례대로 괄호 안에 묶어서 표현한다.

위 그림에서 왼쪽의 영상은 오른쪽의 배열과 같이 숫자로 주어지며, 이 영상을 쿼드 트리 구조를 이용하여 압축하면 "(0(0011)(0(0111)01)1)"로 표현된다N ×N 크기의 영상이 주어질 때, 이 영상을 압축한 결과를 출력하는 프로그램을 작성하시오.

 

풀이

1. 이 문제는 분할정으로 풀 수 있는 문제입니다

2. 조건이 만족하지 않는 경우(색상이 모두 같은 경우가 아닌 경우)4개로 쪼개서 다시 푸는 방식입니다. 시작하기 전에 괄호 ‘(‘ 를 넣고, 4개로 쪼개고 나서 각 처리를 다 하면, 다시 괄호 ‘)’를 넣습니다.

3. 4개로 쪼개는 것은 재귀 함수를 호출하여 풀고, 전달인자로 그 사분면의 가장 왼쪽 위의 좌표와 크기를 넣습니다.

4. 조건이 만족하는 경우(하나의 색상으로만 구성되는 경우)는 해당 색상의 값을 출력해줍니다.

전체 코드

n = int(input())
board = [list(map(int, input())) for _ in range(n)]


def dfs(x, y, n):
    check = board[x][y]
    for i in range(x, x + n):
        for j in range(y, y + n):
            if check != board[i][j]:
                check = -1
                break

    if check == -1:
        print("(", end='')
        n = n // 2
        dfs(x, y, n)  
        dfs(x, y + n, n) 
        dfs(x + n, y, n)  
        dfs(x + n, y + n, n)  
        print(")", end='')

    elif check == 1:
        print(1, end='')
    else:
        print(0, end='')

dfs(0, 0, n)
반응형

+ Recent posts