본문 바로가기
알고리즘 백준문제풀기

백준 python 1759번 / 20208번 / 1149번풀이

by deeplearningkakao 2022. 2. 2.
반응형

백준 python 1759번 

 

입력

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

출력

각 줄에 하나씩, 사전식으로 가능성 있는 암호를 모두 출력한다.

Python
l, c = map(int, input().split())
cipher = list(input().split())
visited = [False] * c
vowels = ['a', 'e', 'i', 'o', 'u']
cipher.sort()

string =""

def BackTrack(depth, start):
    global string
    if depth == l:
        Vaildation(string)
        return

    for i in range(start, c):
        if visited[i]:
            continue
        visited[i] = True
        string += cipher[i]
        BackTrack(depth+1, i)
        string = string[:-1]
        visited[i] = False

def Vaildation(string):
    vowel_count = 0
    consonant_count = 0
    for i in range(len(string)):
        if string[i] in vowels:
            vowel_count += 1
        else:
            consonant_count += 1

        if i == len(string) - 1:
            if vowel_count >= 1 and consonant_count >= 2 :
                print(string)

BackTrack(0, 0)

 

백준 20208번

입력

첫번째 줄에 민초마을의 크기인 N과 진우의 초기체력 M, 그리고 민트초코우유를 마실때 마다 증가하는 체력의 양 H가 공백을 두고 주어진다. N, M, H는 모두 10보다 작거나 같은 자연수이다.

두번째 줄부터 N+1번째 줄에 N칸에 걸쳐서 민초마을의 지도가 주어진다. 각 칸은 공백을 두고 주어지며 지도상에서 진우의 집은 1, 민트초코우유는 2로 주어지며 빈 땅은 0으로 주어진다. 진우의 집은 무조건 한 곳이 주어지며 마을에 배달되는 민트초코우유의 총합은 10개를 넘지 않는다.

 

출력

진우가 집을 나와서 다시 집으로 돌아올 때 까지 마실 수 있는 민트초코우유의 최대 개수를 출력하자.

 

반응형
Python
n, hp, hp_puls = map(int, input().split())

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

max_mint = 0
eat_mint = 0
start_x = -1
start_y = -1
mint_position = list()

for i in range(n):
    for j in range(n):
        if graph[i][j] == 1:
            start_x = i
            start_y = j
            mint_position.append((i, j))
        elif graph[i][j] == 2:
            mint_position.append((i, j))


def BackTrack(x, y):
    global hp, eat_mint, max_mint

    for i in range(len(mint_position)):
        mint_x, mint_y = mint_position[i]
        if graph[mint_x][mint_y] == 2:
            if hp >= abs(x - mint_x) + abs(y - mint_y):
                graph[mint_x][mint_y] = 0
                hp += hp_puls
                hp -= abs(x - mint_x) + abs(y - mint_y)
                eat_mint += 1
                BackTrack(mint_x, mint_y)
                hp -= hp_puls
                hp += abs(x - mint_x) + abs(y - mint_y)
                eat_mint -= 1
                graph[mint_x][mint_y] = 2
        elif graph[mint_x][mint_y] == 1:
            if hp >= abs(x - mint_x) + abs(y - mint_y):
                max_mint = max(eat_mint, max_mint)

BackTrack(start_x, start_y)
print(max_mint)

 

 

백준 python 1149번

입력

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 

Python
import copy

n = int(input())
cost = [list(map(int, input().split())) for _ in range(n)]
dp = [[10001] * 3 for _ in range(n)]
def RGB():
    for i in range(n):
        for j in range(3):
            if i == 0:
                dp[i][j] = cost[i][j]
            else:
                if j == 0:
                    dp[i][j] = min(dp[i-1][1], dp[i-1][2]) + cost[i][j]
                elif j == 1:
                    dp[i][j] = min(dp[i - 1][0], dp[i - 1][2]) + cost[i][j]
                else:
                    dp[i][j] = min(dp[i - 1][0], dp[i - 1][1]) + cost[i][j]
RGB()
print(min(dp[n-1]))
반응형

댓글