문제 연결리스트를 뒤집어라. 입력 : [1 -> 2- > 3 -> 4 -> 5 -> NULL] 출력 : [5 -> 4 -> 3 -> 2 - > 1 -> NULL] 정답코드 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def reverseList(self, head: ListNode) -> ListNode: node, prev = head, None while node: next, node.next = node.next, prev prev, node = node, next return 출처 : github.com/onlybooks/al..
문제 정렬되어있는 두 연결 리스트를 합쳐라. 입력: l1 = [1 -> 2-> 4] / l2 = [1 -> 3-> 4] 출력 : [1 -> 1 -> 2 -> 3 -> 4 -> 4] 나의코드 (Fail) # 정렬되어있는 두 연결 리스트를 합쳐라 # 입력 1->2->4, 1->3->4 # 출력 1->1->2->3->4->4 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 리스트 변환 def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode: while l1 is not None: prev = l1.val while l2 is not None: if pre..
문제 연결리스트가 팰린드롬인지 체크해라. 팰린드롬이란, 거꾸로 해도 같은 문자를 뜻한다. 입력 [1 -> 2] : False 입력 [1 - > 2 -> 2 -> 1] : True 나의코드 # 연결리스트가 팰린드롬인지 체크 (팰린드롬이란, 거꾸로해도 같은 문자) # 입력 1-> 2 : false # 입력 1->2->2->1 : true from typing import List class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 리스트 변환 def isPalindrome(self, head: ListNode) -> bool: # 노드가 1개일 경우 - 팰린드롬 if head.next is None: r..
문제 가로의 길이가 N, 세로의 길이가 2인 직사각형 형태의 얇은 바닥이 있다. 이 얇은 바닥을 덮개로 채우고자 하는데, 해울 수 있는 모든 경우의수를 구하라. 덮개는 1 X 2, 2 X 1, 2 X 2 이렇게 3가지로 구성되어있다. 만약 N이 3일 경우 1) (2 X 1) + (2 X 2) 2) (2 X 2) + (2 X 1) 3) (1 X 1) + (1 X 1) + (1 X 1) 4) (2 X 1) + (1 X 2) + (1 X 2) 5) (1 X 2) + (1 X 2) + (2 X 1) 총 5가지 경우가 나온다. 정답코드 # 정수 N을 입력 받기 n = int(input()) # 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화 d = [0] * 1001 # 다이나믹 프로그래밍(Dynamic P..
문제 n개의 페어를 이용한 min(a, b)의 합으로 만들 수 있는 가장 큰 수를 출력하라. 입력: [1, 4, 3, 2] 출력: 4 min(1, 2) + min(3, 4)일 경우에 최대값 4를 출력하게된다. 나의 코드 # min(a, b)의 합으로 만들 수 있는 가장 큰수 # 정렬 # 앞에서 2개씩 묶기 # 작은겄기리 묶고 큰것끼리 묶어야 최소값의 합이 가장 커진다 # [1, 4, 3, 2] -> [1, 2, 3, 4] # 앞에서부터 2개씩 묶었을때 짝수번째의 원소만 추출하면 된다. nums = [1, 4, 3, 2] nums.sort() result = 0 # 반복문 인덱스를 사용하여 짝수번째 원소만 추출 for i, a in enumerate(nums): if i % 2 == 0: result +=..
문제 한번의 거래로 낼 수 있는 최대 이익을 산출하라. 입력 : [7, 1, 5, 3, 6, 4] 출력 : 5 위 예제에서는 1일대 구매하여 6일 경우 판매하는 것이 최대 이익 5를 얻을 수 있다. 나의 코드 1) 첫번째 코드 list = [7, 1, 5, 3, 6, 4] min_value = min(list) # 최소값 저장 min_index = list[min_value] # 최소값 인덱스 저장 print(list[min_value]) # 최소 값의 인덱스 찾기 if min_index == len(list) - 1: print(0) else: # 반복문 실행 for i, v in enumerate(list): if i < min_index: # 최소값 인덱스보다 왼쪽은 pop (이유: 최소값일때 사는..
문제 어떤수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고한다. 단, 두번째 연산은 N이 K로 나누어떨어질 때만 선택할 수 있다. 1. N에서 1을 뺀다. 2. N을 K로 나눈다. 예를 들어 N = 17, K = 4일 경우 1) 17 - 1 = 16 2) 16 // 4 = 4 3) 4 // 4 = 1 전체 과정을 실행한 횟수는 3이 된다. 이는 N을 1로 만드는 최소 횟수이다. 나의 코드 # 1) N에서 1을 뺀다 # 2) N을 k로 나눈다. # 1) N/K 가 나누어 떨어지는 경우 나눗셈 실행 (우선실행해야 횟수를 최소한으로 할 수 있다.) # 2) 나누어떨어지지 않은 경우 -1 실행 N = 17 K = 4 count = 0 while N != 1: if N % K !=..
문제 다양한 수로 이루어진 배열이 있을때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없다. list = [2, 4, 5, 4, 6], M = 8, K = 3 이 경우 특정한 인덱스의 수가 연속해서 세번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6 + 6 + 6 + 5 + 6 + 6 + 6 + 6 = 46이 된다. 나의 코드 # 가장 큰 수를 k번 반복 # 두번째로 작은 수를 k번 반복 후 넣고 또다시 가장 큰수 반복 # 위를 실행하며 M개 미만인지 체크해야한다. test = [2, 4, 5, 4, 6] m = 8 # 개수 제한 k = 3 # 반복 개수 제한 # 가장 큰 수 max_value = ma..
문제 정수 X가 주어질때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지이다. 1) X가 5로 나누어떨어지면, 5로 나눈다. 2) X가 3으로 나누어 떨어지면, 3으로 나눈다. 3) X가 2로 나누어 떨어지면, 2로 나눈다. 4) X에서 1을 뺀다. 정수 X가 주어졌을때, 연산 4개를 적절히 사용해서 1을 만들어야한다. 이 연산을 사용하는 횟수의 최솟값을 출력해라. X = 26일 경우 1. 26 - 1 = 25 2. 25 /5 = 5 3. 5 / 5 = 1 출력값 : 3 나의 코드 풀이를 완성하지 못했다. 우선 마지막까지 해본 코드는 아래와 같다. 몫과 나머지를 이용해서 풀어보려고 했지만 최소 횟수를 구하기에는 역부족이였다. value = 26 result = 0 while value != 1: #..
문제 개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다. 메뚜기 마을의 식량창고는 일직선으로 이어져있고, 개미 전사는 선택적으로 약탈하여 식량을 빼앗을 예정이다. 이때 메투기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있다. 따라서 개미 전사는 정찰병에게 들키지않기 위해 최소한 한 칸 이상 떨어진 식량창고를 약탈해야한다. 예시 [1, 3, 1, 5] 개미전사는 두번째 식량창고와 네번째 식량창고를 선택했을때 최대값인 8개의 식량을 빼앗을 수 있다. 나의 코드 list = [1, 3, 1, 5] odd_sum = 0 even_sum = 0 for i, value in enumerate(list): if i % 2 == 0..