[항해99 취업 리부트 코스 학습일지] 4주차 - 자료구조 & 알고리즘 학습 1일차

eundore·2024년 4월 10일
1
post-thumbnail

오늘의 TIL

부분 수열의 합

"""
57796kb 480ms

✅ point : 완전 탐색
1. 1 ~ n 까지 for문 순회
2. 1번 for문 안에서 입력받은 숫자들(nums)의 r개의 조합들을 for문 순회
3. 2번 for문 안에서 만약 그 조합(items)의 합이 s와 같다면 경우의 수(cnt)를 추가
"""
from itertools import combinations

n, s = map(int, input().split())
nums = list(map(int, input().split()))

cnt = 0
for r in range(1, n + 1):
    for items in list(combinations(nums, r)):
        if sum(items) == s:
            cnt += 1

print(cnt)

리모컨

"""
31120kb 652ms

⚠️ Chat GPT 가 짠 코드 (이해 완료)

맨 아래 주석을 단 코드로 짰으나
접근 방법을 아예 가늠하지 못 하고
시간이 지체된 관계로 검색함.
"""


def possible(channel, broken_buttons):
    for digit in str(channel): #이동하려는 채널의 각 번호마다 for문 순회
        if digit in broken_buttons: #해당 번호가 고장난 버튼의 번호라면
            return False #만들 수 없는 채널이므로 False 반환
    return True #확인이 모두 끝나면 만들 수 있는 채널이므로 True 반환


def press_buttons(N, broken_buttons):
    min_press = abs(N - 100)  # 숫자 버튼을 사용하지 않고 +, - 버튼만을 사용하는 경우

    for channel in range(1000001):
        # 채널은 무한대이지만 이동 가능한 채널의 조건은 500,000으로 넉넉 잡아서 500,000*2 (=1,000,000) 만큼 순회
        if possible(channel, broken_buttons):  # 0 ~ 1000000 안에 만들 수 있는 채널 번호 확인
            min_press = min(min_press, len(str(channel)) + abs(channel - N))
            # (번호 누른 횟수(=번호 길이) + 남은 채널 수 (= +,- 버튼을 눌러야 하는 수))와 min_press 비교하여 더 작은 수 반환

    return min_press


N = int(input())  # 목표 채널
M = int(input())  # 고장난 버튼의 개수
broken_buttons = set(input().split()) if M > 0 else set() # 고장난 버튼이 없을 수 있으므로 초기화 처리

print(press_buttons(N, broken_buttons))

# n = input()
#
# _ = input()
#
# broken_buttons = list(map(int, input().split()))
#
# buttons = [x for x in range(10) if x not in broken_buttons]
#
# current = ''
# cnt = 0
# for char in n:
#     number = int(char)
#
#     if number in buttons:
#         current = str(number)
#         cnt += 1
#     else:
#         closest_number = min(buttons, key=lambda x: abs(x - buttons))
#
#         print(closest_number)


항해99 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.

0개의 댓글