Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python

  1. Python으로 좌우 서브트리가 동일한 가장 큰 서브트리 찾는 방법

    문제 소개 하나의 이진 트리(binary tree)가 주어졌을 때, 왼쪽 서브트리와 오른쪽 서브트리가 완전히 동일한 가장 큰 서브트리를 찾는 문제입니다. 이때 선호되는 시간 복잡도는 O(n)입니다. 예를 들어 아래와 같은 트리가 입력으로 주어진다면, 결과는 다음과 같이 나타납니다. 접근 방법 이 문제는 후위 순회(postorder traversal)를 활용한 재귀적 방식으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 각 노드를 기준으로 서브트리의 구조와 값을 문자열로 직렬화(인코딩)합니다. 왼쪽 서브트리의 인코딩

  2. Python으로 증가 부분과 감소 부분이 서로 다른 두 배열에서 나오는 가장 긴 바이토닉 수열 찾기

    문제 소개두 개의 배열이 주어졌을 때, 가장 긴 바이토닉(bitonic) 수열을 찾는 것이 목표입니다. 이때 반드시 지켜야 할 조건은 다음과 같습니다.증가하는 부분은 반드시 첫 번째 배열(A)의 부분 수열(subsequence)이어야 합니다.감소하는 부분은 반드시 두 번째 배열(B)의 부분 수열이어야 합니다.예를 들어 입력이 A = [2, 6, 3, 5, 4, 6], B = [9, 7, 5, 8, 4, 3]이라면 출력은 [2, 3, 4, 6, 9, 7, 5, 4, 3]이 됩니다. 이 수열은 2 → 3 → 4 → 6까지 배열 A에서

  3. Python으로 문자를 제거·재배열해 만들 수 있는 가장 긴 회문 찾기

    문자열이 하나 주어졌을 때, 문자열에서 문자를 삭제하거나 재배열(shuffle)하여 만들 수 있는 가장 긴 회문(palindrome)을 찾아야 합니다. 만약 만들 수 있는 회문이 여러 개라면 그중 하나만 반환하면 됩니다.예를 들어 입력이 pqqprrs라면, 출력은 pqrsrqp가 됩니다.접근 방법회문은 왼쪽 절반과 오른쪽 절반이 거울상처럼 대칭을 이루는 문자열입니다. 따라서 각 문자를 짝수 개씩 좌우에 배치하고, 개수가 홀수인 문자는 최대 하나만 가운데에 둘 수 있습니다. 이 성질을 활용하면 다음과 같은 단계로 문제를 해결할 수 있

  4. Python으로 복제된 두 배열에서 누락된 요소 찾기 (이진 탐색 활용)

    문제 개요두 개의 배열이 있고, 이 둘은 단 하나의 요소를 제외하면 완전히 동일한(복제 관계인) 배열이라고 가정해 보겠습니다. 즉, 한쪽 배열에만 존재하는 요소가 하나 있다는 의미입니다. 우리의 목표는 바로 이 누락된 요소를 찾아내는 것입니다.예를 들어 입력이 A = [2, 5, 6, 8, 10], B = [5, 6, 8, 10]이라면, 두 번째 배열에는 2가 존재하지 않으므로 결과값은 2가 됩니다.해결 접근 방식두 배열이 정렬되어 있다는 전제 조건이 있다면, 선형 탐색 대신 이진 탐색(Binary Search)을 활용하여 O(lo

  5. Python으로 배열에서 가장 가까운 왼쪽·오른쪽 작은 요소 간 최대 차이 구하기

    정수로 이루어진 배열이 주어졌을 때, 배열의 각 요소에 대해 가장 가까운 왼쪽 작은 값과 가장 가까운 오른쪽 작은 값 사이의 최대 절대 차이를 구하는 문제를 살펴보겠습니다.만약 어떤 요소의 왼쪽이나 오른쪽에 더 작은 요소가 존재하지 않는다면, 해당 방향의 작은 값은 0으로 간주합니다.문제 예시입력 배열이 다음과 같다고 가정해 보겠습니다.A = [3, 5, 9, 8, 8, 10, 4]이 경우 출력 결과는 4가 됩니다. 그 이유는 다음과 같습니다.왼쪽 작은 요소 배열 L = [0, 3, 5, 5, 5, 8, 3]오른쪽 작은 요소 배열

  6. Python으로 모든 도시와 가장 가까운 역 사이의 최대 거리 구하기

    ```html N개의 도시가 있으며, 각 도시는 0부터 N-1까지 번호가 매겨져 있다고 가정해 보겠습니다. 또한 역이 설치된 도시들의 목록도 함께 주어집니다. 우리가 구해야 하는 값은 임의의 도시에서 가장 가까운 역까지의 거리 중 최대값입니다. 이때 역이 있는 도시들은 순서에 상관없이 주어질 수 있다는 점에 유의해야 합니다. 예를 들어 입력이 N = 6이고 stations = [2, 4]라면 출력은 2가 됩니다. 도시 0에서 가장 가까운 역(2번)까지의 거리가 2로, 모든 도시 중 가장 먼 거리이기 때문입니다. 문제 해결 접근 방법

  7. 파이썬으로 격자에서 최장 뱀 시퀀스(Snake Sequence) 찾는 법

    뱀 시퀀스(Snake Sequence)란?숫자로 채워진 2차원 격자(grid)에서 뱀 시퀀스를 찾는 문제를 생각해 보겠습니다. 가능한 시퀀스가 여러 개라면 그중 하나만 반환하면 됩니다.뱀 시퀀스는 격자에서 서로 인접한 칸의 숫자들을 연결해 만든 수열입니다. 조건은 간단합니다. 현재 값이 셀 (a, b)에 있을 때, 오른쪽 칸 (a, b+1) 또는 아래쪽 칸 (a+1, b)에 있는 값이 현재 값과 정확히 ±1만큼 차이가 나야 합니다. 즉, 값이 1씩 오르거나 내려가는 방향으로만 이동할 수 있습니다.예제로 살펴보기다음과 같은 4×4 격

  8. 파이썬으로 처음 N개 자연수 제곱의 합이 X 이하가 되는 최대 N 구하기

    정수 X가 주어졌을 때, 처음 N개의 자연수 제곱의 합(1² + 2² + ... + N²)이 X를 초과하지 않는 최대값 N을 구하는 문제를 살펴보겠습니다.예를 들어 입력이 X = 7이라면 출력은 2가 됩니다. N = 3일 경우 수열의 합이 1² + 2² + 3² = 1 + 4 + 9 = 14로 X = 7을 초과하기 때문입니다. 따라서 조건을 만족하는 N의 최댓값은 2입니다.해결 접근 방식이 문제는 이진 탐색(Binary Search)을 활용하면 효율적으로 해결할 수 있습니다. N이 커질수록 제곱의 합도 단조 증가하기 때문에, 특정

  9. Python으로 N을 1로 줄이는 최대 연산 횟수 구하기

    문제 설명 두 수 P와 Q가 있으며, 이 두 수로 N = (P!/Q!)라는 수를 만든다고 가정해 보겠습니다. 목표는 가능한 한 많은 연산을 수행하여 N을 1로 줄이는 것입니다. 각 연산에서는 N이 X로 나누어떨어지는 경우 N을 N/X로 대체할 수 있으며, 가능한 최대 연산 횟수를 반환해야 합니다. 예를 들어 입력이 A = 7, B = 4라면 출력은 4가 됩니다. 이 경우 N은 210이며, 소인수가 2, 3, 5, 7로 총 4개이기 때문입니다. 접근 방법 이 문제를 해결하기 위해 다음 단계를 따릅니다. N := 1000005로 설정

  10. 파이썬으로 배열에서 요소를 삭제하며 얻을 수 있는 최대 포인트 구하기

    N개의 요소로 이루어진 배열 A와 두 개의 정수 l, r이 주어져 있다고 가정해 보겠습니다(단, 1 ≤ ax ≤ 10^5, 1 ≤ l ≤ r ≤ N). 배열에서 임의의 요소 ax를 선택해 제거하면, 동시에 ax+1, ax+2 … ax+r에 해당하는 모든 요소와 ax−1, ax−2 … ax−l에 해당하는 모든 요소도 함께 배열에서 사라집니다. 이 작업을 수행하면 ax만큼의 포인트를 얻게 되며, 우리의 목표는 배열의 모든 요소를 제거한 후 획득한 총 포인트를 최대화하는 것입니다.예를 들어 입력이 A = [2,4,3,10,5], l =

  11. Python으로 i < j < k와 a[i] < a[j] < a[k] 조건을 만족하는 삼중항의 최대 합 찾기

    문제 개요양수로만 이루어진 배열이 주어져 있다고 가정해 봅시다. 배열에는 n개의 요소가 있으며, 우리는 다음 두 조건을 동시에 만족하는 삼중항(ai + aj + ak)의 최대 합을 구해야 합니다.조건: 0 <= i < j < k < n 이면서 ai < aj < ak즉, 세 요소의 인덱스 순서와 값의 크기 순서가 모두 오름차순을 유지해야 한다는 의미입니다.입력 예시배열 A = [3, 6, 4, 2, 5, 10]이 주어졌을 때, 가능한 삼중항과 각각의 합은 다음과 같습니다.(3, 4, 5): 합 = 12

  12. 파이썬으로 BST 중앙값 구하기 — O(n) 시간, O(1) 공간에 해결하는 모리스 순회 기법

    이진 탐색 트리(Binary Search Tree, BST)가 주어졌을 때, 이 트리의 중앙값(median)을 구하는 문제를 생각해 봅시다.중앙값의 정의는 노드 개수에 따라 다음과 같습니다.노드 수가 짝수일 때: 중앙값 = ((n/2번째 노드 + (n+1)/2번째 노드) / 2노드 수가 홀수일 때: 중앙값 = (n+1)/2번째 노드예를 들어 아래와 같은 BST가 입력으로 주어지면, 출력은 7이 됩니다.접근 방법: 모리스 순회(Morris Traversal)일반적인 중위 순회(inorder traversal)는 재귀 호출이나 스택을

  13. 파이썬으로 배열의 최소 조정 비용 구하기

    문제 개요양수로만 이루어진 배열이 주어졌다고 가정해 보겠습니다. 배열의 각 원소를 새로운 값으로 교체하여, 인접한 두 원소의 차이가 항상 주어진 target 값 이하가 되도록 만들어야 합니다. 이때 우리의 목표는 조정 비용, 즉 새 값과 기존 값의 차이의 절댓값 합을 최소화하는 것입니다.수식으로 표현하면 ∑|A[i] − Anew[i]|를 최소화하는 문제이며, 여기서 i는 0부터 n−1까지의 범위입니다(n은 배열 A의 크기). Anew는 인접 원소 간 차이가 target 이하가 되도록 조정된 배열을 의미합니다.예를 들어 입력이 [56

  14. Python에서 주어진 제약 조건으로 모든 작업을 완료하는 최소 시간 찾기

    서로 다른 소요 시간을 가진 여러 작업(job)의 배열이 있고, 이를 수행할 k명의 담당자가 있다고 가정해 봅시다. 또한 각 담당자가 작업 한 단위를 처리하는 데 걸리는 시간 t도 주어집니다. 우리는 다음과 같은 제약 조건 하에 모든 작업을 완료하는 데 필요한 최소 시간을 구해야 합니다. 한 명의 담당자에게는 연속된 작업만 배정할 수 있습니다. 두 명의 담당자가 하나의 작업을 나누어 수행하거나 공유할 수 없습니다. 예를 들어, 입력이 k = 4, t = 5, job = {12, 6, 9, 15, 5, 9}라면 출력은 75가 됩니

  15. 파이썬으로 정렬된 연속 숫자 배열에서 누락된 요소 찾기 (이진 탐색 활용)

    오름차순으로 정렬된 서로 다른 n개의 숫자로 이루어진 배열 A가 있다고 가정해 보겠습니다. 이 배열에는 요소 하나가 빠져 있으며, 우리의 목표는 바로 그 누락된 요소를 찾아내는 것입니다. 예를 들어 입력이 A = [1, 2, 3, 4, 5, 6, 7, 9]라면, 1부터 9까지 연속된 숫자 중 8이 빠져 있으므로 출력 결과는 8이 됩니다. 접근 방법: 이진 탐색 배열이 이미 정렬되어 있기 때문에 이진 탐색(Binary Search)을 활용하면 선형 탐색보다 훨씬 효율적으로 문제를 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.

  16. Python으로 비트 OR 연산 결과가 K와 같은 N개의 고유한 숫자 찾기

    두 개의 정수 N과 K가 주어졌을 때, 서로 다른 N개의 값을 찾아 이들을 비트별 OR(bitwise OR) 연산했을 때 그 결과가 정확히 K와 같아지도록 해야 합니다. 만약 가능한 조합이 존재하지 않는다면 -1을 반환합니다.예를 들어 입력이 N = 4, K = 6이라면 출력은 [6, 0, 1, 2]가 됩니다. 실제로 6 | 0 | 1 | 2 = 6이므로 조건을 충족합니다.해결 접근 방법이 문제는 다음 단계에 따라 해결할 수 있습니다.MAX := 32로 설정합니다.visited := 크기가 MAX인 리스트를 생성하고 False로 채

  17. Python으로 문자열의 n번째 사전식 순열 구하기

    문제 개요소문자로만 이루어진 길이 m인 문자열이 주어졌을 때, 이 문자열에서 만들 수 있는 모든 순열을 사전식(lexicographic) 순서로 정렬했을 때 n번째 순열을 찾는 문제입니다.예를 들어 문자열이 pqr이고 n = 3이라면, 전체 순열은 [pqr, prq, qpr, qrp, rpq, rqp]처럼 정렬된 순서로 나열되므로 세 번째인 qpr이 결과가 됩니다.해결 접근 방법모든 순열을 직접 생성하는 것은 비효율적이므로, 각 자리에 올 수 있는 문자를 결정하면서 남은 순열의 개수를 계산(다항계수 활용)하여 n번째 순열을 효율적으

  18. 파이썬으로 점화식의 n번째 항 구하기: log₂(bₙ) 계산 방법

    수열 bn이 다음과 같은 점화식으로 정의되어 있다고 가정해 봅시다.b1 = 1, bn+1/bn = 2n이때 주어진 n에 대해 log2(bn)의 값을 구하는 것이 목표입니다.예를 들어 입력값이 6이라면 출력은 15가 됩니다. 그 이유는 log2(bn) = (n × (n - 1)) / 2 이므로, (6 × (6 - 1)) / 2 = 15가 되기 때문입니다.수학적 풀이 과정이 문제는 점화식을 단계적으로 전개하여 해결할 수 있습니다.bn+1/bn = 2nbn/bn-1 = 2n-1...b2/b1 = 21위의 모든 식을 좌변끼리, 우변끼리 곱

  19. Python으로 모든 쌍의 gcd() 결과에서 원래 숫자 복원하기

    문제 개요어떤 배열의 모든 가능한 요소 쌍에 대한 최대공약수(GCD) 값들이 주어진 배열 A가 있다고 가정해 봅시다. 이때 우리의 목표는 이 GCD 배열을 만드는 데 사용된 원래 숫자들을 찾아내는 것입니다.예를 들어, 입력이 A = [6, 1, 1, 13]이라면 출력은 [13, 6]이 됩니다. 그 이유는 다음과 같습니다.gcd(13, 13) = 13gcd(13, 6) = 1gcd(6, 13) = 1gcd(6, 6) = 6즉, 두 숫자 13과 6으로 만들 수 있는 네 가지 쌍의 GCD 결과가 정확히 입력 배열과 일치합니다.해결 접근

  20. Python으로 정렬된 이중 연결 리스트에서 곱이 주어진 값과 일치하는 쌍 찾기

    서로 다른 양의 정수로 구성되어 있고 오름차순으로 정렬된 이중 연결 리스트(doubly linked list)가 있다고 가정해 봅시다. 이때 리스트 안에서 두 노드 데이터의 곱이 주어진 값 x와 같아지는 모든 쌍(pair)을 찾아야 합니다. 여기서 중요한 제약 조건은 추가적인 메모리 공간을 사용하지 않고 문제를 해결해야 한다는 점입니다.예를 들어, 입력이 L = 1 ↔ 2 ↔ 4 ↔ 5 ↔ 6 ↔ 8 ↔ 9이고 x = 8이라면, 곱이 8이 되는 쌍은 (1, 8)과 (2, 4)이므로 출력은 다음과 같습니다.(1, 8), (2, 4)접

Total 8989 -컴퓨터  FirstPage PreviousPage NextPage LastPage CurrentPage:160/450  20-컴퓨터/Page Goto:1 154 155 156 157 158 159 160 161 162 163 164 165 166