개요이진 탐색 트리(Binary Search Tree, BST)의 후위 순회(postorder traversal) 결과가 하나 주어졌을 때, 이를 역추적하여 원래의 이진 탐색 트리를 복원하는 문제입니다.예를 들어 입력이 [6, 12, 10, 55, 45, 15]라면, 다음과 같은 BST가 만들어집니다.알고리즘 접근 방식후위 순회는 왼쪽 → 오른쪽 → 루트 순서로 방문하기 때문에, 배열의 마지막 요소가 곧 트리의 루트가 됩니다. 배열을 끝에서부터 앞으로 거꾸로 순회하면서 스택(stack)을 활용하면 각 노드의 부모-자식 관계를 효율적
Pandas는 일반적으로 CSV 파일을 읽어 DataFrame을 생성하는 데 많이 사용되지만, 파일이 아닌 문자열(string) 형태의 데이터로도 동일한 작업을 수행할 수 있습니다. 이 글에서는 문자열 데이터를 활용해 Pandas DataFrame을 구성하는 방법을 알아보겠습니다.StringIO를 활용한 문자열 데이터 처리문자열 데이터를 CSV처럼 다루려면 io 모듈의 StringIO 래퍼(wrapper)를 사용해야 합니다. StringIO는 문자열을 마치 파일 객체처럼 취급할 수 있게 해주기 때문에, pd.read_csv() 함수
문제 개요크기를 나타내는 변수 N, 배열 원소들의 총합을 나타내는 변수 SUM, 그리고 배열의 어떤 원소도 K보다 클 수 없다는 조건이 주어진다고 가정해 봅시다. 이때 우리가 찾아야 하는 것은 모든 원소가 서로 다른(중복이 없는) 배열입니다. 만약 주어진 조건을 만족하는 배열이 존재하지 않는다면 -1을 반환해야 합니다.예를 들어 입력이 N = 4, SUM = 16, K = 9라면 출력은 [1, 2, 4, 9]가 됩니다.접근 방법이 문제의 핵심은 서로 다른 원소로 만들 수 있는 합계의 범위를 먼저 파악하는 것입니다.최소 합(minim
문제 소개 두 개의 정렬된 연결 리스트(linked list)가 주어졌을 때, 시작 노드부터 끝 노드까지 이동하면서 노드 값의 합이 가장 커지는 경로만으로 구성된 새로운 연결 리스트를 만들어야 합니다. 최종 결과 리스트는 두 입력 리스트에 속한 노드들을 모두 포함할 수 있습니다. 다만 결과 리스트를 생성하는 과정에서 한쪽 리스트에서 다른 쪽 리스트로 전환할 수 있는 지점은 오직 교차점, 즉 두 리스트에서 값이 서로 같은 노드뿐이라는 제약 조건이 있습니다. 또한 추가 메모리를 상수(constant) 크기만 사용해야 하므로, 새로운 리
문제 개요정수 배열 A가 주어졌을 때, (A[0] XOR X) + (A[1] XOR X) + … + (A[n−1] XOR X)의 합이 최소가 되도록 하는 수 X를 찾는 것이 이번 포스트의 목표입니다.예를 들어 입력이 [3, 4, 5, 6, 7]이라면 출력은 X = 7, Sum = 10이 됩니다.접근 방법: 비트 단위 분석이 문제를 효율적으로 풀기 위한 핵심 아이디어는 각 비트 위치를 독립적으로 고려하는 것입니다.XOR 연산에서 특정 비트의 결과는 두 피연산자의 해당 비트가 서로 다를 때만 1이 됩니다. 따라서 어떤 비트 자리에서 배
두 문자열 S와 T가 주어졌을 때, 길이가 같으면서 사전순(lexicographically)으로 S보다 크고 T보다 작은 문자열이 존재하는지 확인해야 합니다. 만약 그러한 문자열이 없다면 -1을 반환합니다. 여기서 말하는 사전순 비교는 다음과 같이 정의됩니다. S = S1S2…Sn이 T = T1T2…Tn보다 사전순으로 작다는 것은, 어떤 인덱스 i가 존재하여 S1 = T1, S2 = T2, …, Si−1 = Ti−1을 만족하면서 Si < Ti인 경우를 의미합니다. 예를 들어 입력이 S = bbb, T = ddd라면 출력은 b
문제 개요숫자로 이루어진 배열이 주어졌을 때, 배열의 요소 중 정확히 하나를 제외한 나머지 모든 요소의 약수가 되는 수 B를 찾아야 합니다. 이때 전체 요소의 최대공약수(GCD)는 1이 아니라는 조건이 주어집니다.예를 들어 입력이 {8, 16, 4, 24}라면, 출력은 8입니다. 8은 배열에서 4를 제외한 나머지 세 요소(8, 16, 24)를 모두 나눌 수 있기 때문입니다.해결 접근 방식이 문제는 접두사(prefix) GCD와 접미사(suffix) GCD 배열을 활용하면 효율적으로 해결할 수 있습니다.핵심 아이디어는 다음과 같습니다
정수 n이 주어지며, 이 수에는 1, 2, 3 세 가지 자릿수만 포함되어 있다고 가정해 보겠습니다. 우리는 단 하나의 자릿수를 3으로 바꿀 수 있으며, 그 결과 만들 수 있는 최대 숫자를 구해야 합니다.예를 들어 입력값이 11332라면, 맨 앞자리의 1을 3으로 바꾸어 출력은 31332가 됩니다.해결 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.n의 각 자릿수를 요소로 하는 리스트 li를 생성합니다.x를 0부터 리스트 길이 - 1까지 반복합니다.만약 li[x]가 3이 아니라면,li[x]를 3으로 변경합니다.리스트의 자릿수들을
문자열 s가 주어졌다고 가정해 봅시다. 이 문자열은 오전(am) 또는 오후(pm) 접미사가 붙은 12시간제 시간을 나타내며, 우리는 이를 24시간제 표기법으로 변환해야 합니다. 예를 들어 입력이 "08:40pm"이라면 출력은 "20:40"이 되어야 합니다. 문제 해결 접근 방식 이 문제는 다음 단계를 따라 해결할 수 있습니다. hour: 문자열 s의 인덱스 0~2 구간(시 부분)을 정수로 변환한 뒤 12로 나눈 나머지를 저장합니다. minutes: 문자열 s의 인덱스 3~5 구간(분 부분)을 정
문제 소개 숫자 n이 주어졌을 때, 1부터 n까지의 숫자로 이루어진 리스트를 만드는 것이 목표입니다. 단, 3의 배수이거나 숫자 안에 3, 6, 9가 하나라도 포함된 경우에는 해당 숫자를 문자열 clap으로 대체해야 합니다. 이는 한국에서 즐기는 전통 놀이인 369 게임을 프로그래밍으로 옮긴 대표적인 연습 문제로, 조건문과 반복문 학습에 적합합니다. 예를 들어 입력이 20이라면 출력은 다음과 같습니다. [1, 2, clap, 4, 5, clap, 7, 8, clap, 10, 11, clap, clap, 14, clap, clap,
문제 개요양수 n이 주어졌을 때, 이 숫자를 3의 음수가 아닌 배수와 7의 음수가 아닌 배수의 합으로 표현할 수 있는지 확인하는 문제입니다.예를 들어, 입력값이 13이라면 결과는 True입니다. 왜냐하면 13은 다음과 같이 표현할 수 있기 때문입니다.1 × 7 + 2 × 3 = 13해결 접근 방법이 문제는 간단한 반복문을 통해 해결할 수 있습니다.0부터 n까지 7씩 증가시키면서 반복합니다.각 단계에서 (n - i)가 3으로 나누어 떨어지는지 확인합니다.나누어 떨어진다면 해당 조합이 존재한다는 의미이므로 True를 반환합니다.모든 경
문제 정의에코 모드가 있는 휴대폰을 생각해 봅시다. 이 모드는 배터리 잔량이 20%에 도달하면 자동으로 활성화되며, 에코 모드에서는 배터리가 일반 모드보다 두 배 느리게 소모됩니다.집을 나설 때 배터리는 100%였고, t분 후에는 p%가 남아 있다고 합니다. 이때 휴대폰이 완전히 꺼질 때까지 앞으로 몇 분이나 사용할 수 있는지 구하는 것이 문제의 목표입니다.예를 들어 입력이 t = 75, p = 25라면 출력은 45가 됩니다.풀이 접근 방법핵심은 현재 배터리 잔량이 20%보다 큰지 작은지에 따라 소모 속도를 다르게 계산하는 것입니다
문자열 s가 하나의 문구를 나타낸다고 가정해 봅시다. 이때 해당 문구의 약어(acronym)를 구하는 것이 목표입니다. 약어는 반드시 대문자로 표기해야 하며, 단어 and는 결과에 포함되지 않아야 합니다.예를 들어 입력이 Indian Space Research Organisation이라면, 각 단어의 첫 글자를 추출하여 출력은 ISRO가 됩니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.입력 문자열 s를 공백 기준으로 분리하여 각 단어를 배열(tokens)에 저장합니다.결과를 담을 빈 문자열(string)을 초기
프로그래밍 문제를 풀다 보면 시간 계산 로직을 구현해야 하는 경우가 자주 있습니다. 이번 글에서는 am 또는 pm 접미사가 붙은 12시간제 시간 문자열과 정수 n이 주어졌을 때, n분을 더한 뒤 동일한 형식으로 새로운 시간을 반환하는 방법을 알아보겠습니다.문제 예시예를 들어 입력이 다음과 같다고 가정해 보겠습니다.s = 8:20pmn = 150150분(2시간 30분)을 더하면 출력 결과는 10:50pm이 됩니다.해결 접근 방법이 문제는 다음 단계를 순서대로 수행하면 해결할 수 있습니다.문자열 s에서 시(h)와 분(m) 부분을 추출합
정수 리스트 n이 하나 주어져 있다고 가정해 봅시다. 이 리스트는 하나의 십진수를 나타내며, 각 원소 n[i]는 0부터 9 사이의 값을 가집니다. 예를 들어 n이 [2, 4, 9]라면 이는 숫자 249를 의미합니다.우리가 해야 할 일은 이 숫자에 1을 더한 결과를 동일한 리스트 형태로 반환하는 것입니다.문제 예시입력이 n = [9, 9]라면, 99에 1을 더하면 100이 되므로 출력은 [1, 0, 0]이 됩니다. 이처럼 마지막 자릿수가 9일 경우 올림(carry)이 연쇄적으로 발생할 수 있어 단순히 마지막 원소만 바꾸는 것으로는 해
아나그램이란?두 문자열 s0과 s1이 주어졌을 때, 이들이 서로 아나그램(anagram) 관계인지 판별하는 문제를 살펴보겠습니다. 아나그램이란 한 문자열의 글자 순서를 재배열하여 다른 문자열을 만들 수 있는 경우를 말합니다. 즉, 두 문자열이 같은 문자들을 정확히 같은 개수만큼 포함하고 있으면 아나그램입니다.예를 들어, 입력이 s0 = listen, s1 = silent라면, 두 단어는 같은 알파벳들로 구성되어 있으므로 출력은 True가 됩니다.해결 접근 방법이 문제는 매우 간단한 방법으로 해결할 수 있습니다. 핵심 아이디어는 다음
문제 이해하기 고대 우주비행사들이 사용하는 언어에는 일반적인 알파벳 순서와 다른 자신들만의 문자 배열 규칙이 있다고 상상해 봅시다. 우리에게는 이 특별한 규칙을 나타내는 문자열 사전이 하나 주어집니다. 이 사전은 고대 우주비행사 언어의 부분적인 사전식(lexicographic) 순서를 의미합니다. 우리의 과제는 임의의 문자열 s가 이 사전 순서에 따라 올바르게 정렬되어 있는지 확인하는 것입니다. 예시 예를 들어, 사전이 bdc이고 검사할 문자열이 bbbb h ddd i cccc라고 합시다. 이 경우 출력 결과는 True입니다. b는
숫자 리스트 nums가 주어졌을 때, 리스트 안에 서로 3배 관계에 있는 두 숫자가 존재하는지 확인하는 문제입니다. 즉, 어떤 숫자가 다른 숫자의 정확히 3배인 경우가 있는지 검사해야 합니다.예를 들어 입력이 nums = [2, 3, 10, 7, 9]라면 결과는 True입니다. 리스트 안의 9가 3의 3배이기 때문입니다.해결 접근 방법이 문제는 정렬과 두 포인터(two pointer) 기법을 활용하면 효율적으로 해결할 수 있습니다. 단계별 과정은 다음과 같습니다.포인터 i를 0으로 초기화합니다.리스트 n을 오름차순으로 정렬합니다.포
개요단일 연결 리스트(singly linked list)의 헤드(head)가 주어졌을 때, 노드들의 값이 엄격하게 오름차순(strictly ascending order)으로 정렬되어 있는지 확인하는 문제를 살펴보겠습니다.예를 들어, 입력 리스트가 [2, 61, 105, 157]이라면 각 값이 이전 값보다 크므로 출력은 True가 됩니다. 반면 중간에 같거나 작아지는 값이 있다면 False를 반환해야 합니다.문제 해결 접근 방식이 문제는 재귀(recursion)를 활용하면 간단하게 해결할 수 있습니다. 다음 단계를 따릅니다:solve
소문자 알파벳으로 이루어진 문자열 text가 주어졌을 때, 문자열 내 모든 문자를 알파벳 기준 정반대 위치의 문자로 치환한 새로운 문자열을 만들어야 합니다. 예를 들어 a는 z로, b는 y로 변환되는 방식입니다.이러한 치환 방식은 고대 히브리 문자에서 유래한 Atbash(앗바쉬) 암호로 알려져 있으며, 각 문자를 알파벳 순서상 거울 위치의 문자로 바꾸는 가장 단순한 형태의 치환 암호 중 하나입니다.따라서 입력이 abcdefg라면 출력은 zyxwvut이 됩니다.해결 접근 방법이 문제는 다음 단계를 따르면 해결할 수 있습니다.N :=