알파벳, 숫자, 그리고 다양한 기호가 섞여 있는 문자열이 있다고 가정해 봅시다. 이 문자열에는 대문자와 소문자가 함께 포함되어 있을 수 있습니다. 이때 소문자와 숫자만을 기준으로(대문자는 소문자로 변환) 해당 문자열이 회문(palindrome)인지 판별하는 것이 목표입니다. 쉼표, 공백, 콜론 같은 기호는 모두 무시합니다.문제 이해하기예를 들어 문자열이 A Man, a Plan, a Canal: Panama라고 한다면, 위의 규칙을 적용하면 amanaplanacanalpanama가 됩니다. 이 문자열은 앞에서 읽어도 뒤에서 읽어도
배열 A가 주어졌다고 가정해 봅시다. 이 배열에는 대부분의 숫자가 두 번씩 등장하지만, 딱 하나의 요소만 한 번만 등장합니다. 우리의 목표는 바로 이 유일한 요소를 찾아내는 것입니다.예를 들어 A = [1, 1, 5, 3, 2, 5, 2]라면 출력 결과는 3이 됩니다. 1, 5, 2는 각각 두 번씩 나타나지만 3은 한 번만 존재하기 때문입니다.XOR 연산이 답인 이유모든 숫자가 짝수 번 등장한다는 점이 핵심 힌트입니다. XOR(배타적 OR) 연산은 다음과 같은 성질을 가집니다.y XOR y = 0 : 같은 값을 두 번 XOR하면 0
배열 회전 문제란?배열 A가 주어졌을 때, 이 배열을 오른쪽으로 k칸 회전해야 하는 문제를 생각해 보겠습니다. 예를 들어 배열이 A = [5, 7, 3, 6, 8, 1, 5, 4]이고 k = 3이라면, 최종 결과는 [1, 5, 4, 5, 7, 3, 6, 8]이 됩니다.회전 과정은 한 칸씩 차례대로 진행되며, 각 단계는 다음과 같습니다.1단계: [4, 5, 7, 3, 6, 8, 1, 5]2단계: [5, 4, 5, 7, 3, 6, 8, 1]3단계: [1, 5, 4, 5, 7, 3, 6, 8]해결 접근 방법매번 한 칸씩 옮기면 비효율적이
부호 없는 정수 n이 주어졌을 때, 이 숫자를 이진수로 표현했을 때 포함된 1의 개수를 구하는 문제를 생각해 봅시다. 이 값은 흔히 해밍 웨이트(Hamming Weight)라고 불리며, 비트 연산 알고리즘 문제에서 자주 등장하는 개념입니다.예를 들어 이진수가 000000101101이라면, 1이 총 4개 있으므로 결과는 4가 됩니다.문제 해결 접근 방법이 문제는 다음 단계를 통해 간단하게 해결할 수 있습니다.주어진 숫자를 이진수 문자열로 변환합니다.카운터 변수를 초기화합니다 (count = 0).이진수 문자열의 각 문자를 하나씩 순회
문제 개요한 도시에 여러 채의 집이 있고, 각 집에는 일정 금액의 현금이 보관되어 있다고 가정해 보겠습니다. 한 명의 강도가 단 하룻밤 사이에 이 돈을 훔치려고 하는데, 이 도시에는 보안 시스템이 설치되어 있어 같은 날 밤에 연속된 두 집이 침입당하면 자동으로 경찰에 신고됩니다. 따라서 강도는 인접한 두 집을 동시에 털 수 없으며, 우리는 이 조건 하에서 강도가 훔칠 수 있는 최대 금액을 구해야 합니다.금액 정보는 배열로 제공됩니다. 인덱스 i에서 A[i]는 i번째 집에 보관된 금액을 의미합니다. 예를 들어 배열이 A = [2, 7
문제 정의하한값 n이 주어졌을 때, 2부터 n까지 범위에 존재하는 소수(prime number)의 개수를 구하는 문제입니다. 예를 들어 n = 10이라면, 10보다 작은 소수는 2, 3, 5, 7로 총 4개이므로 결과는 4가 됩니다.해결 접근 방식: 에라토스테네스의 체이 문제는 에라토스테네스의 체(Sieve of Eratosthenes) 알고리즘을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 소수를 하나 발견할 때마다 그 소수의 배수들을 모두 합성수로 표시하여, 이후 탐색에서 제외하는 것입니다.구체적인 진행 과정은 다음
연결 리스트(Linked List)가 주어졌을 때, 이를 역순으로 뒤집는 것이 이번 글의 목표입니다. 예를 들어 리스트가 1 → 3 → 5 → 7 형태라면, 뒤집힌 새로운 리스트는 7 → 5 → 3 → 1이 됩니다. 접근 방식: 재귀(Recursion) 활용 이 문제는 재귀 함수를 사용하면 간결하게 해결할 수 있습니다. 핵심 아이디어는 노드를 하나씩 순회하면서 각 노드의 next 포인터를 이전 노드를 가리키도록 변경하는 것입니다. 알고리즘은 다음과 같습니다. solve(head, back) 함수를 정의하여 리스트를 재귀적으로 뒤집
문제 소개숫자로 이루어진 리스트가 주어졌을 때, 이 리스트 안에 중복된 요소가 존재하는지 확인해야 합니다.예를 들어, 리스트가 [1, 5, 6, 2, 1, 3]이라면 1이 두 번 등장하므로 결과는 True입니다. 반면 리스트가 [1, 2, 3, 4]라면 중복된 값이 없으므로 결과는 False가 됩니다.해결 아이디어이 문제는 집합(set) 자료구조의 특성을 활용하면 간단하게 해결할 수 있습니다.집합은 중복을 허용하지 않는 자료구조입니다. 즉, 동일한 값을 여러 번 저장하려고 해도 하나만 유지됩니다. 반면 리스트는 중복 값을 그대로 저
이진 트리(binary tree)가 주어졌을 때, 좌우를 뒤집은 반전된 이진 트리(inverted binary tree)를 만드는 것이 목표입니다. 예를 들어 아래와 같은 트리가 있다고 가정해 보겠습니다.이 트리를 반전하면 모든 노드의 왼쪽 자식과 오른쪽 자식이 서로 교체되어, 거울에 비친 것처럼 좌우가 대칭으로 뒤집힌 형태의 트리가 됩니다.문제 해결 접근 방식이 문제는 재귀(recursion)를 이용하면 매우 간단하게 해결할 수 있습니다. 알고리즘의 핵심 단계는 다음과 같습니다.루트(root)가 null이면 그대로 반환합니다. (
몇 개의 요소로 구성된 연결 리스트가 있다고 가정해 봅시다. 우리의 과제는 주어진 노드를 리스트에서 삭제하는 함수를 작성하는 것입니다. 예를 들어 리스트가 1 → 3 → 5 → 7 → 9와 같을 때, 값이 3인 노드를 삭제하면 결과는 1 → 5 → 7 → 9가 됩니다.노드 삭제의 핵심 원리일반적인 연결 리스트에서 노드를 삭제하려면 이전 노드에 대한 참조가 필요하지만, 삭제할 노드 자체를 가리키는 포인터 node만 주어진 경우에는 다른 접근 방식을 사용할 수 있습니다. 바로 현재 노드를 다음 노드로 덮어쓰는 기법입니다.삭제할 노드를
아나그램(Anagram)은 주어진 문자열의 모든 순열(permutation)을 의미합니다. 일반적인 패턴 검색 알고리즘과 달리, 이 문제에서는 텍스트 안에서 정확한 패턴만 찾는 것이 아니라 주어진 패턴의 모든 가능한 배열을 검색해야 합니다.예를 들어 ANAGRAM과 NAAGARM은 글자의 구성이 같으므로 서로 아나그램 관계입니다. 반면 cat과 fat은 구성하는 글자가 다르기 때문에 아나그램이 아닙니다.문제 해결 접근 방식두 문자열이 아나그램인지 판별하는 가장 간단하고 직관적인 방법은 다음과 같습니다.각 문자열을 개별 문자들의 리스
0부터 n까지의 숫자로 구성된 리스트가 있다고 가정해 보겠습니다. 그런데 이 중 한 개의 숫자가 누락되어 있습니다. 우리의 목표는 비효율적인 전수 조사가 아닌, 효율적인 알고리즘으로 이 누락된 숫자를 찾아내는 것입니다.예를 들어, 리스트가 다음과 같다면:A = [0, 1, 2, 3, 4, 5, 7, 8, 9]여기서 빠진 숫자는 6입니다. 이 문제는 이진 탐색(Binary Search) 기법을 활용하면 매우 효율적으로 해결할 수 있습니다.알고리즘 접근 방식이진 탐색을 적용하는 핵심 아이디어는 간단합니다. 오름차순으로 정렬된 배열에서
문제 개요숫자들을 담고 있는 배열이 있다고 가정해 보겠습니다. 배열에는 0이 아닌 값과 0이 섞여 있으며, 우리의 목표는 다른 숫자들의 상대적인 순서를 유지하면서 모든 0을 배열의 오른쪽 끝으로 이동시키는 것입니다.예를 들어, 배열이 [0, 1, 5, 0, 3, 8, 0, 0, 9]라면 최종 결과는 [1, 5, 3, 8, 9, 0, 0, 0, 0]이 되어야 합니다.해결 접근 방식이 문제는 두 단계로 나누어 해결할 수 있습니다.0이 아닌 값 앞쪽으로 모으기: 삽입 위치를 나타내는 인덱스(index)를 0으로 초기화합니다. 그리고 배열
숫자 n이 주어졌을 때, 이 숫자가 3의 거듭제곱인지 판별하는 문제입니다. 예를 들어 n = 27이라면 27은 3³이므로 결과는 true가 되고, n = 15라면 3의 거듭제곱이 아니므로 결과는 false가 됩니다. 해결 방법 이 문제는 로그(logarithm)를 활용하면 간단하게 해결할 수 있습니다. 접근 방식은 다음과 같습니다. 로그 연산을 사용해 문제를 해결합니다. [log₁₀(n) / log₁₀(3)] mod 1 == 0 이면 그 수는 3의 거듭제곱이고, 그렇지 않으면 3의 거듭제곱이 아닙니다. 원리는 다음과 같습니다.
파이썬에서 문자열 뒤집기문자 배열로 이루어진 문자열이 주어졌을 때, 추가 공간(메모리)을 사용하지 않고 문자열을 제자리(in-place)에서 뒤집어야 한다고 가정해 보겠습니다. 예를 들어 입력이 [H, E, L, L, O]라면 출력은 [O, L, L, E, H]가 되어야 합니다.해결 접근 방법이 문제는 투 포인터(Two Pointers) 기법을 활용하면 효율적으로 해결할 수 있습니다. 단계별 과정은 다음과 같습니다.두 개의 포인터를 설정합니다: start = 0, end = 문자열 길이 - 1start 위치의 문자와 end 위치의
두 정수 a와 b가 주어졌을 때, 이 두 수의 합을 구하는 것이 우리의 과제입니다. 여기서 중요한 제약 조건은 +나 - 같은 산술 연산자를 사용할 수 없다는 점입니다. 예를 들어 a = 5, b = 7이라면 결과는 12가 되어야 합니다.해결 접근 방식이 문제는 비트(bitwise) 논리 연산자를 활용하면 해결할 수 있습니다. 해결 과정은 다음과 같습니다.XOR(^), AND(&), 왼쪽 시프트(<<) 같은 비트 연산자를 사용합니다.b가 0이면 a를 그대로 반환합니다. 이것이 재귀 호출의 종료 조건입니다.그렇지 않으
문제 개요 주어진 문자열에서 딱 한 번만 등장하는 첫 번째 문자를 찾아야 합니다. 예를 들어 문자열이 people이라면, 한 번만 나타나는 가장 앞쪽의 문자는 o이며, 이 문자의 인덱스인 2를 반환합니다. 만약 조건을 만족하는 문자가 존재하지 않는다면 -1을 반환합니다. 해결 접근 방법 이 문제는 각 문자의 등장 횟수를 기록하는 빈도수 맵(frequency map), 즉 딕셔너리를 활용하면 효율적으로 해결할 수 있습니다. 전체 과정은 다음과 같습니다. 문자별 등장 횟수를 저장할 빈도수 맵(딕셔너리)을 생성합니다. 문자열의 각 문
프로그래밍 면접에서 가장 자주 등장하는 고전 문제 중 하나인 FizzBuzz를 파이썬으로 해결하는 방법을 알아보겠습니다.문제 정의숫자 n이 주어졌을 때, 1부터 n까지의 모든 숫자를 문자열 형태로 출력해야 합니다. 단, 다음과 같은 규칙이 적용됩니다.숫자가 3으로 나누어 떨어지면 숫자 대신 Fizz를 출력합니다.숫자가 5로 나누어 떨어지면 숫자 대신 Buzz를 출력합니다.숫자가 3과 5 모두로 나누어 떨어지면 숫자 대신 FizzBuzz를 출력합니다.해결 접근 방법이 문제는 조건문의 순서가 핵심입니다. 다음 단계를 따라 해결할 수 있
두 개의 정수가 주어졌을 때, 이 두 수 사이의 해밍 거리(Hamming Distance)를 구하는 문제를 살펴보겠습니다.해밍 거리란 두 숫자를 이진수로 표현했을 때 서로 다른 비트의 개수를 의미합니다. 예를 들어 7과 15를 이진수로 나타내면 각각 0111과 1111인데, 최상위 비트(MSb)만 서로 다르므로 해밍 거리는 1이 됩니다.해결 접근 방법이 문제는 비트 연산을 활용해 다음과 같은 단계로 해결할 수 있습니다.i = 31부터 0까지 반복합니다.b1 = x를 i비트만큼 오른쪽 시프트한 후 1과 AND 연산b2 = y를 i비트
연결 리스트가 주어졌을 때, 이 리스트 안에 사이클(순환)이 존재하는지 판별하는 문제를 생각해 봅시다. 사이클은 리스트의 마지막 노드(tail)가 다시 앞쪽 노드를 가리킬 때 발생합니다.이 문제에서는 pos라는 정수 포인터를 사용해 사이클을 표현합니다. pos는 꼬리 노드가 연결되는 위치(인덱스)를 의미하며, pos가 -1이면 사이클이 없다는 뜻입니다.예를 들어 연결 리스트가 [5, 3, 2, 0, -4, 7]이고 pos = 1이라면, 마지막 노드가 두 번째 노드(값 3)에 연결되어 있으므로 사이클이 존재합니다.해결 접근 방법가장