๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ณ ๋“์  kit - ์™„์ „ํƒ์ƒ‰ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 2. 7.

<๋ฌธ์ œ๋งํฌ>

https://school.programmers.co.kr/learn/courses/30/parts/12230

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

<ํ’€์ด ์ „๋žต>

1. ์™„์ „ํƒ์ƒ‰์ด๋ผ ํŠน๋ณ„ํ•œ ํ’€์ด์ „๋žต๋ณด๋‹ค ๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ๊ณ  ์ถฉ์‹คํžˆ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฌธ์ œ๋“ค์ด๋‹ค.

2. 6๋ฒˆ์งธ ๋ฌธ์ œ์ธ ์ „๋ ฅ๋ง ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ๋Š” ์—ฐ๊ฒฐ๊ด€๊ณ„ ํŒŒ์•…์„ ์œ„ํ•ด bfs๋กœ ํ’€์—ˆ๋‹ค. 

 

<์ •๋‹ต ์ฝ”๋“œ>

# 1. ์ตœ์†Œ ์ง์‚ฌ๊ฐํ˜•

def solution(sizes):
    
    sizes = list(map(sorted, sizes))
    x = max(sizes, key = lambda x: x[0])
    y = max(sizes, key = lambda x: x[1])
    
    answer = x[0] * y[1]

    return answer

 

# 2. ๋ชจ์˜๊ณ ์‚ฌ

def solution(answers):
    answer = []
    
    supo_1 = [1, 2, 3, 4, 5] * 2000
    supo_2 = [2, 1, 2, 3, 2, 4, 2, 5] * 1250
    supo_3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] * 1000
    
    cnt_1, cnt_2, cnt_3 = 0, 0, 0
    
    for i in range(len(answers)):
        ans = answers[i]
        
        if ans == supo_1[i]:
            cnt_1 += 1
        
        if ans == supo_2[i]:
            cnt_2 += 1
            
        if ans == supo_3[i]:
            cnt_3 += 1
        
    max_score = max([cnt_1, cnt_2, cnt_3])
        
    temp_list =  list(enumerate([cnt_1, cnt_2, cnt_3], start = 1))
                      
    for (idx, score) in temp_list:
        if score == max_score:
            answer.append(idx)
    
    return answer

 

# 3. ์†Œ์ˆ˜์ฐพ๊ธฐ

from itertools import permutations
import math

def solution(numbers):
    answer = 0
    
    def sieve(num):
        
        if num == 1:
            return False
        
        for i in range(2, int(math.sqrt(num)) + 1):
            if num % i == 0:
                return False
            
        return True
    
    checked = set()
    
    for i in range(1, len(numbers) + 1):
        for perm in permutations(numbers, i):
                        
            num = ''.join(perm)
            num = int(num)
            
            if num == 0:
                continue
            
            if num in checked:
                continue
            
            checked.add(num)
            
            if sieve(num):
                answer += 1
            
        
        
    return answer

 

# 4. ์นดํŽซ

def solution(brown, yellow):
    
    # ์‚ฌ๊ฐํ˜• ๋‘˜๋ ˆ์˜ ์ ˆ๋ฐ˜
    perimeter_half = (brown +4) // 2
    
    # ์‚ฌ๊ฐํ˜• ๊ฐ€๋กœ ์„ธ๋กœ ๊ธธ์ด ๊ฒฝ์šฐ์˜ ์ˆ˜ ์™„์ „ํƒ์ƒ‰
    for i in range(3, perimeter_half//2 + 1):
        
        j = perimeter_half - i
        
        if (i - 2) * (j - 2) == yellow:
            
            answer =  [j, i]
            break
    
    
    return answer

 

# 5. ํ”ผ๋กœ๋„

from itertools import permutations

def solution(k, dungeons):
    answer = 0
    N = len(dungeons)
    
    for perm in permutations(dungeons):
        cnt = 0
        left = k
        
        for i in range(N):
            
            energy = perm[i]
            if left >= energy[0]:
                left -= energy[1]
                cnt += 1
                
        answer = max(cnt, answer)
    
    return answer

 

# 6. ์ „๋ ฅ๋ง ๋‘˜๋กœ ๋‚˜๋ˆ„๊ธฐ

from collections import deque
from sys import maxsize


def bfs(start: int, graph: list, visited: list):

    queue = deque()
    queue.append(start)
    visited[start] = 1

    while queue:
        current = queue.popleft()

        for next in graph[current]:

            if visited[next]:
                continue

            visited[next] = 1
            queue.append(next)
    
    return sum(visited)


def solution(n:int, wires:list):
    answer = maxsize

    for i in range(len(wires)):

        cut_wire = wires[:]
        cut_wire.remove(wires[i])

        graph = [[] for _ in range(n + 1)]
        
        for node1, node2 in cut_wire:
            graph[node1].append(node2)
            graph[node2].append(node1)
        
        visited = [0 for _ in range(n + 1)]
        
        cnt = 0
        for edge in graph:
            if edge:
                cnt = bfs(edge[0], graph, visited)
                break

        diff = abs(n - cnt - cnt)

        
        answer = min(answer, diff)


    return answer

 

# 7. ๋ชจ์Œ์‚ฌ์ „

from itertools import product


def solution(word):
    vowel = ['A', 'E', 'I', 'O', 'U']
    word_list = []

    for length in range(1, 6):
        for prod in product(vowel, repeat=length):
            word_list.append(''.join(prod))

    word_list.sort()

    for i in range(len(word_list)):
        if word == word_list[i]:
            return i + 1

๋Œ“๊ธ€