문제 개요주어진 문자열에서 접두사이면서 동시에 접미사인 가장 긴 부분 문자열의 길이를 구하는 문제입니다. 예를 들어 문자열 abcab의 경우, ab는 길이가 2이며 접두사와 접미사가 동일한 가장 긴 부분 문자열입니다.입력 및 출력 예시Input: str[] = { aabbccdaabbcc } Output: 6 Input: abdab Output: 2접근 방법문자열의 시작과 끝에서 각각 포인터를 출발시키면 어느 시점에 서로 겹쳐 정상적인 비교가 불가능해집니다. 따라서 문자열을 중간부터 나누어 왼쪽(접두사)과 오른쪽(접미사)을 매칭하는
이번 글에서는 주어진 이진 트리(binary tree)의 왼쪽 뷰(left view)를 출력하는 방법을 다룹니다. 사용자가 데이터를 입력하면 이진 트리가 생성되고, 이렇게 만들어진 트리의 왼쪽 뷰를 화면에 출력하는 것이 프로그램의 목표입니다.이진 트리 왼쪽 뷰란?이진 트리의 왼쪽 뷰란 트리를 왼쪽에서 바라볼 때 보이는 노드들, 즉 각 레벨(level)에서 가장 왼쪽에 위치한 노드들을 의미합니다.이진 트리의 모든 노드는 최대 2개의 자식 노드를 가질 수 있으므로, 프로그램은 각 노드에 연결된 포인터 중 왼쪽 포인터만 순차적으로 따라가
이번 글에서는 사용자가 지정한 레벨 k에 존재하는 이진 트리(binary tree)의 리프 노드를 출력하는 방법을 알아보겠습니다.리프 노드(leaf node)란 왼쪽과 오른쪽 자식 포인터가 모두 NULL인 노드를 의미합니다. 즉, 어떤 자식 노드도 가지지 않는 트리의 끝 노드이며, 부모 노드가 아닌 노드라고 할 수 있습니다.예시입력 : 11 22 33 66 44 88 77출력 : 88 77여기서 k는 출력 대상이 되는 트리의 레벨을 나타냅니다. 해결 방식은 모든 노드를 순회하면서 해당 노드가 자식 포인터를 가지고 있는지 검사하는 것
이 문제에서는 n개의 양의 정수로 이루어진 배열이 주어지며, 배열 안에서 AND 연산(&)의 결과값이 가장 큰 두 요소의 쌍을 찾아야 합니다.예시입력: arr[] = { 4, 8, 12, 16 } 출력: pair = 8 12 최대 AND 값 = 8 입력: arr[] = { 4, 8, 16, 2 } 출력: pair = No possible AND 최대 AND 값 = 0배열에서 최대 AND 값을 구하는 방법은 배열 내 최대 AND 값 찾기 알고리즘과 유사합니다. 프로그램은 해당 AND 값을 만들어내는 실제 요소들의 쌍까지 출력해야 합
문제 개요이 프로그램은 이진 트리의 중간 레벨에 있는 노드들을 출력해야 합니다. 예를 들어 트리의 레벨이 총 4개라면 레벨 2에 해당하는 노드들이 출력 대상이 됩니다. 여기서 핵심 요구 사항은 트리의 높이를 먼저 구하지 않고 중간 레벨을 찾아내는 것입니다.포화 이진 트리(Perfect Binary Tree)란?포화 이진 트리는 모든 내부 노드가 반드시 두 개의 자식을 가지며, 모든 리프 노드가 동일한 레벨(깊이)에 위치하는 트리를 말합니다.위 그림에서 확인할 수 있는 특징은 다음과 같습니다.내부 노드 21과 32는 모두 자식 노드를
이번 글에서 다룰 과제는 주어진 이진 트리의 오른쪽 뷰(Right View), 즉 각 레벨에서 가장 오른쪽에 있는 노드들을 출력하는 것입니다. 사용자가 데이터를 입력하여 이진 트리를 생성하면, 완성된 트리의 오른쪽 뷰를 화면에 출력하게 됩니다.위 다이어그램은 10, 42, 93, 14, 35, 96, 57, 88 노드로 구성된 이진 트리를 보여줍니다. 이 노드들 중 트리의 오른쪽 측면에 위치한 노드들만 골라 화면에 표시합니다. 예를 들어 10, 93, 57, 88이 이진 트리의 오른쪽 뷰에 해당하는 노드입니다.예제입력 : 10 42
이 글에서는 재귀 함수를 이용해 주어진 연결 리스트(Linked List)를 역순으로 출력하는 방법을 알아봅니다. 여기서 중요한 점은 리스트의 노드 순서는 그대로 유지한 채, 화면에는 역순으로 출력만 한다는 것입니다. 즉, 실제로 리스트를 뒤집지 않습니다.프로그램은 첫 번째 노드의 주소를 담고 있는 head 포인터가 마지막 노드에 저장된 NULL을 만날 때까지 다음 노드로 이동하면서, 각 단계에서 head 노드의 데이터를 출력하는 방식으로 동작합니다.동작 원리먼저 노드들을 리스트에 삽입하고, 포인터가 삽입된 노드들을 가리키도록 합니
문제 개요이번 글에서 다룰 과제는 n×n 크기의 행렬을 대각선(diagonal) 패턴으로 출력하는 것입니다.예를 들어 n이 3일 때, 대각선 패턴을 따라 숫자를 채운 행렬은 다음과 같은 형태가 됩니다.1 2 4 3 5 7 6 8 9숫자 1부터 시작해 왼쪽 위에서 오른쪽 아래로 향하는 대각선 방향을 따라 값이 차례대로 채워지는 것을 확인할 수 있습니다.입력 및 출력 예시입력: 3 출력: 1 2 4 3 5 7 6 8 9 입력: 4 출력: 1 2 4 7 3 5 8 11 6 9 12 14
이 문제에서는 주어진 연결 리스트를 순회하면서 하나의 노드는 건너뛰고 다음 노드를 출력하는 방식으로, 반복(iterative) 방법을 사용해 대체 노드(alternate nodes)를 출력하는 프로그램을 작성해야 합니다.반복 방법이란 일반적으로 조건이 참(true)인 동안 계속 실행되는 루프(loop)를 사용하는 방식을 말합니다.예를 들어, 리스트에 29, 34, 43, 56, 88이라는 노드가 있다면, 출력 결과는 29, 43, 88처럼 하나씩 건너뛴 노드들이 됩니다.예제입력: 29->34->43->56->8
이 글에서는 재귀(Recursion) 기법을 활용해 연결 리스트(Linked List)의 뒤에서부터 k개의 노드를 출력하는 방법을 알아봅니다.재귀 접근 방식이란 함수가 자기 자신을 반복적으로 호출하면서 조건이 충족될 때까지 실행되고 그 결과를 저장하는 프로그래밍 기법입니다. 연결 리스트에 재귀를 적용하면 리스트를 끝까지 먼저 탐색한 뒤, 되돌아오는 과정에서 원하는 노드들을 순서대로 처리할 수 있다는 장점이 있습니다.예를 들어 리스트에 29, 34, 43, 56, 88이라는 노드가 저장되어 있고 k의 값이 2라고 가정해 보겠습니다.
양의 정수 n이 주어졌을 때, O(1)의 추가 공간만 사용하여 시계 방향으로 회전하는 n×n 나선 행렬(spiral matrix)을 생성하고 출력하는 것이 이 글의 목표입니다.나선 행렬이란?나선 행렬은 원의 중심에서 출발해 시계 방향으로 회전하며 값을 채워 나가는 행렬입니다. 이 문제에서는 2 → 4 → 6 → 8 → 10 → 12 → 14 → 16 → 18처럼 연속된 짝수가 나선 형태로 배치된 행렬을 상수 공간 복잡도로 출력해야 합니다.예시입력: 3 출력: 9 8 7 2 1 6 3 4 1메모리 제약 없이 코드
연결 리스트의 마지막 k개 노드를 역순으로 출력하기이번 글에서는 연결 리스트(Linked List)의 마지막 k개 노드를 역순으로 출력하는 방법을 다룹니다. 문제 해결에는 재귀가 아닌 반복문(iterative) 기반 접근법을 사용합니다.반복문 방식은 조건이 참(true)인 동안 계속 실행되는 루프를 활용하는 기법입니다. 재귀 호출에 따른 함수 호출 스택 오버헤드가 없기 때문에, 큰 크기의 리스트를 다룰 때에도 안정적으로 동작한다는 장점이 있습니다.예를 들어, 연결 리스트에 29, 34, 43, 56, 88이라는 노드가 저장되어 있고
이 글에서는 연결 리스트(Linked List)에서 주어진 인덱스에 해당하는 노드의 데이터를 출력하는 방법을 알아봅니다. 배열과 달리 연결 리스트는 일반적으로 인덱스 개념을 가지지 않기 때문에, 리스트를 처음부터 끝까지 순회하면서 원하는 위치에 도달했을 때 해당 노드의 데이터를 출력하는 방식으로 문제를 해결해야 합니다. 예를 들어, 연결 리스트에 29, 34, 43, 56, 88 다섯 개의 노드가 저장되어 있고 인덱스 값으로 1, 2, 4가 주어진다면, 출력 결과는 각 인덱스에 위치한 노드인 34, 43, 88이 됩니다. 예시
주어진 줄 수를 바탕으로 최소한의 복잡도로 대칭 이중 삼각형(symmetric double triangle) 패턴을 출력하는 것이 이번 문제의 목표입니다.예시입력: 5 출력: X X O X O X X O X O X X O X O X X문제 접근 방식전체 패턴은 크게 세 부분으로 나누어 생각할 수 있습니다.윗부분(상단): n이 홀수일 때는 n-1줄, 짝수일 때는 n-2줄을 출력합니다.중간 부분: n이 홀수일 때는 1줄, 짝수일 때는 3줄을
정수 n이 주어졌을 때, 오직 0과 1로만 이루어진 수들을 찾아 그 합이 정확히 n이 되도록 출력하는 것이 이번 문제의 목표입니다. 0과 1로만 구성된 대표적인 수로는 1, 10, 11이 있습니다. 이러한 수들은 각 자릿수가 0 또는 1뿐이므로, 이들을 적절히 더하면 어떤 양의 정수든 표현할 수 있습니다. 예를 들어 n = 31을 입력하면 10 + 10 + 11 또는 10 + 10 + 10 + 1처럼 여러 가지 조합이 가능합니다. 예시 입력: 31 출력: 10 10 10 1 접근 방법 및 알고리즘 이 문제는 그리디(greedy) 기
정수형 요소로 구성된 배열이 주어졌을 때, 중복된 값을 제거하고 고유한(distinct) 요소만 골라 정렬된 순서로 출력하는 것이 이번 글의 목표입니다.예를 들어 4, 6, 5, 3, 4, 5, 2, 8, 7, 0과 같은 정수 값들이 저장된 배열이 있다고 가정해 보겠습니다. 이 배열을 단순히 오름차순으로 정렬하면 0, 2, 3, 4, 4, 5, 5, 6, 7, 8이 되지만, 여기에는 여전히 중복된 값인 4와 5가 남아 있습니다. 따라서 중복을 제거한 최종 결과는 0, 2, 3, 4, 5, 6, 7, 8이 됩니다.예제입력: array
n×n 크기의 2차원 배열이 주어졌을 때, 각 요소의 원래 위치를 변경하지 않고 배열의 요소를 스네이크(지그재그) 패턴으로 출력하는 프로그램을 만들어 보겠습니다.스네이크 패턴이란 첫 번째 행은 왼쪽에서 오른쪽으로, 다음 행은 오른쪽에서 왼쪽으로 출력하는 방식으로, 마치 뱀이 기어가는 모양처럼 행마다 방향을 번갈아 가며 순회하는 것을 말합니다.예제입력: arr[]= 100 99 98 97 93 94 95 96 92 91 90 89 85 8
문제 정의n×n 크기의 2차원 배열이 주어졌을 때, 배열의 원본 위치를 전혀 변경하지 않은 상태에서 마지막 열, 즉 arr[0][n-1] 요소부터 시작해 모든 요소를 스네이크 패턴으로 출력하는 프로그램을 작성해야 합니다.스네이크 패턴이란 첫 행은 오른쪽→왼쪽, 두 번째 행은 왼쪽→오른쪽, 세 번째 행은 다시 오른쪽→왼쪽 순으로 지그재그 형태로 순회하는 출력 방식입니다. 뱀이 기어가는 모습과 유사하다고 해서 붙여진 이름입니다.예시입력: arr[]= 100 99 98 97 93 94 95 96  
지그재그(Zig-Zag) 방식의 행렬 출력이란? 행렬 mat[row][col]이 주어졌을 때, 아래 이미지처럼 지그재그 형태로 행렬의 모든 요소를 순서대로 출력해야 합니다. 지그재그 순회란 왼쪽 상단에서 출발하여 대각선을 따라 이동하다가 행렬의 경계에 도달할 때마다 방향을 바꾸어 나가는 방식을 말합니다. 따라서 위 행렬에 대한 출력 결과는 다음과 같습니다. Output: 10 20 40 70 50 30 60 80 90 문제 해결 접근 방식 이 문제는 비교적 단순한 접근 방식으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다
C#에서는 값 형식(Value Type)과 참조 형식(Reference Type)을 서로 연결하기 위한 두 가지 메커니즘을 제공합니다. 바로 박싱(Boxing)과 언박싱(Unboxing)입니다. 박싱은 값 형식의 데이터를 개체(object) 형식으로 변환하는 과정이며, 언박싱은 그 반대로 박싱된 개체에서 원래 값 형식의 데이터를 다시 추출하는 과정을 의미합니다. 박싱과 언박싱의 주요 차이점 번호구분 기준박싱(Boxing)언박싱(Unboxing) 1구현 방식값 형식을 감싸는 개체(object) 형식을 만들어 참조합니다.박싱된