R, B, 그리고 점(.) 세 가지 문자로 이루어진 문자열이 있다고 가정해 보겠습니다. 여기서 R은 현재 위치를, B는 막혀 있어 지나갈 수 없는 위치를, 점(.)은 비어 있는 위치를 의미합니다. 한 번의 이동으로 현재 위치에서 인접한 칸으로 움직일 수 있으며, 단 이동하려는 칸이 유효한(비어 있는) 곳이어야 합니다. 이때 가장 왼쪽 끝 또는 가장 오른쪽 끝 위치에 도달할 수 있는지 확인하는 것이 문제입니다.예를 들어 입력이 s = ...........R.....BBBB.....와 같다면 출력은 True가 됩니다. R의 왼쪽 구간에
로봇이 데카르트 좌표평면의 원점 (0, 0)에 위치해 있다고 가정해 보겠습니다. 로봇은 N(북), S(남), W(서), E(동) 네 방향으로만 움직일 수 있으며, 실행 가능한 이동 명령이 문자열 리스트로 주어집니다. 우리가 해야 할 일은 이 이동들을 모두 수행한 뒤, 로봇이 목적지 좌표 (x, y)에 정확히 도달할 수 있는지 판별하는 것입니다.예를 들어, 입력이 다음과 같다면:moves = [N, N, E, E, S]목표 좌표 (x, y) = (2, 1)출력은 True가 됩니다.문제 해결 접근 방식이 문제는 시뮬레이션 기법으로 간단
문제 개요정렬된 숫자 리스트 nums가 주어졌을 때, 리스트 안의 모든 숫자 쌍 사이의 절대 차이의 합을 구하는 문제입니다. 이때 (i, j)와 (j, i)는 서로 다른 쌍으로 간주합니다. 즉, 순서가 있는 쌍(ordered pair) 기준으로 계산하며, 결과가 매우 커질 수 있으므로 109+7로 나눈 나머지를 반환해야 합니다.예시입력이 nums = [2, 4, 8]이라면 출력은 24입니다.|2 - 4| + |2 - 8| + |4 - 2| + |4 - 8| + |8 - 2| + |8 - 4| = 24접근 방법모든 쌍을 일일이 비교하
양수 n이 주어졌을 때, 이 숫자가 서로 다른(중복되지 않는) 양의 팩토리얼 수들의 합으로 표현될 수 있는지 확인하는 문제를 살펴보겠습니다.예를 들어 입력값이 n = 144라면, 4! + 5! = 24 + 120 = 144가 성립하므로 결과는 True가 됩니다.문제 해결 접근 방식이 문제는 그리디(Greedy) 알고리즘을 활용하여 해결할 수 있습니다. 핵심 아이디어는 n보다 작거나 같은 모든 팩토리얼 값을 먼저 구한 뒤, 큰 값부터 차례대로 확인하며 n에서 빼주는 것입니다. 마지막에 n이 0이 된다면 해당 숫자는 팩토리얼 수들의 합
코더들의 실력 평가 점수를 담고 있는 숫자 리스트 ratings가 주어졌다고 가정해 봅시다. 매니저는 모든 코더에게 기본적으로 1000원을 지급하고 싶어 합니다. 단, 두 코더가 서로 인접해 있을 경우에는 실력이 더 좋은 코더에게 반드시 그렇지 못한 코더보다 최소 1000원 이상 더 많이 지급해야 한다는 제약 조건이 있습니다. 우리는 이러한 조건을 모두 만족하면서 매니저가 지급해야 하는 최소 총액을 구하는 프로그램을 작성해야 합니다.예를 들어 입력이 ratings = [1, 2, 5, 1]이라면 출력은 7000이 됩니다. 각 코더에
리스트 형태의 숫자 목록 nums가 주어졌을 때, 이 중에서 가장 먼저 빠져 있는 양의 정수를 찾아야 합니다. 즉, 배열에 존재하지 않는 가장 작은 양의 정수를 구하는 문제입니다. 배열에는 중복된 숫자나 음수가 포함될 수도 있습니다.예를 들어, 입력이 nums = [0, 3, 1]이라면 출력 결과는 2가 됩니다.문제 해결 접근 방법이 문제는 다음 단계를 통해 해결할 수 있습니다.nums에서 양수만 골라 새로운 집합(set)을 만듭니다.집합이 비어 있다면, 즉 양수가 하나도 없다면 1을 반환합니다.1부터 집합 크기 + 2까지 반복하면
문제 개요 크기가 n인, 서로 다른 정수로 이루어진 정렬된 리스트가 주어졌다고 가정해 봅시다. 이때 [1부터 n+1] 범위 안에서 배열에 존재하지 않는 첫 번째 양의 정수를 찾아야 합니다. 예를 들어 입력이 nums = [0, 5, 1]이라면 출력은 2가 됩니다. 1부터 시작해 차례대로 확인할 때 가장 먼저 빠져 있는 숫자가 2이기 때문입니다. 해결 접근 방법 이 문제는 간단한 선형 탐색으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음으로 기대되는 값을 추적하는 것입니다. 단계별로 살펴보면 다음과 같습니다. 찾고자 하는
출발 공항과 도착 공항의 쌍 [from, to]으로 표현된 항공권 목록이 주어졌을 때, 이를 올바른 순서대로 재구성하여 전체 여행 일정을 완성하는 것이 이번 글의 목표입니다. 모든 항공권은 KLK 공항에서 출발하는 한 사람의 소유이므로, 재구성된 여행 일정은 반드시 KLK에서 시작해야 합니다.예를 들어 입력이 [[MUC, LHR], [KLK, MUC], [SFO, SJC], [LHR, SFO]]라면, 출력은 [KLK, MUC, LHR, SFO, SJC]가 됩니다.문제 해결 접근 방식이 문제는 그래프 이론에서 오일러 경로(Euleri
문제 소개간선(edge) 리스트 형태로 표현된 그래프가 주어졌을 때, 해당 그래프가 여러 개의 트리로 구성된 집합, 즉 포레스트(forest)인지 아닌지 판별하는 문제입니다.예를 들어 입력이 [[0, 1], [0, 2], [4, 3]]과 같다면, 각 연결 요소가 사이클 없이 트리 형태를 이루고 있으므로 출력은 True가 됩니다.해결 접근 방법포레스트의 핵심 조건은 사이클(순환 구조)이 존재하지 않아야 한다는 것입니다. 따라서 깊이 우선 탐색(DFS)을 수행하는 도중 이미 방문한 노드를 다시 만나게 된다면, 그래프에 사이클이 존재한다
길이가 같은 두 개의 리스트 weights(무게)와 values(가치), 그리고 하나의 값 capacity(배낭 용량)가 주어졌다고 가정해 봅시다. weights[i]와 values[i]는 각각 i번째 아이템의 무게와 가치를 의미합니다. 이것은 대표적인 부분 배낭(Fractional Knapsack) 문제입니다. 아이템을 통째로 담지 못할 경우에는 일부만 잘라서 담을 수 있고, 이때 가치 역시 담은 비율에 비례하여 계산됩니다. 배낭의 최대 용량 안에서 얻을 수 있는 최대 가치를 구하고, 결과값은 소수점 이하를 버린 정수로 반환해야
문제 설명숫자 n이 주어졌을 때, 다음 규칙에 따라 길이가 n인 문자열을 총 몇 개 생성할 수 있는지 구하는 프로그램을 작성해 보겠습니다.모든 문자는 소문자 모음 [a, e, i, o, u] 중 하나여야 합니다.a 뒤에는 e만 올 수 있습니다.e 뒤에는 a 또는 i만 올 수 있습니다.i 뒤에는 i가 연속해서 올 수 없습니다.o 뒤에는 i 또는 u만 올 수 있습니다.u 뒤에는 a만 올 수 있습니다.결과값이 매우 커질 수 있으므로, 최종 답은 10^9 + 7로 나눈 나머지를 반환합니다.예를 들어 입력이 n = 2라면 출력은 10이 됩니
R에서 summary() 함수를 사용해 데이터 프레임의 통계 요약을 확인하면 최솟값, 1사분위수, 중앙값, 평균, 3사분위수, 최댓값과 같은 기본 정보만 얻을 수 있습니다. 하지만 본격적인 기술 통계 분석에는 분산(variance), 표준편차(standard deviation), 왜도(skewness), 첨도(kurtosis) 등 훨씬 더 다양하고 유용한 지표들이 필요합니다.이럴 때 fBasics 패키지의 basicStats() 함수를 활용하면 데이터 프레임의 각 열에 대한 포괄적인 통계 요약을 한 번에 계산할 수 있습니다.fBas
좌표 평면 위에 놓인 점들의 목록과 숫자 k가 주어졌다고 가정해 봅시다. 각 점은 데카르트 좌표(Cartesian coordinate)를 나타내는 (x, y) 형태입니다. 두 점 p1과 p2 사이의 유클리드 거리가 k 이하일 때, 이 두 점을 같은 그룹으로 묶을 수 있습니다. 이때 구해야 하는 것은 서로 겹치지 않는 분리된 그룹(disjoint groups)의 총 개수입니다.예를 들어 입력이 다음과 같다면,points = [[2, 2], [3, 3], [4, 4], [11, 11], [12, 12]], k = 2출력은 2가 됩니다.
이진 문자열(binary string)이 주어졌을 때, 문자열 내 임의의 위치에 모든 1을 연속적으로 그룹화하기 위해 필요한 최소 스왑(교환) 횟수를 구하는 문제입니다.예를 들어 입력이 10101001101이라면, 출력은 3이 됩니다. 이는 00000111111처럼 모든 1을 하나로 묶는 것이 가능하기 때문입니다.문제 해결 접근 방식이 문제는 슬라이딩 윈도우(Sliding Window)와 누적 합(Prefix Sum) 기법을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.문자열에 있는 1의 총 개수를 셉니
R에서 for 루프는 벡터에 적용할 때와 리스트에 적용할 때 문법상 차이가 전혀 없습니다. 평소 벡터에 사용하던 방식을 그대로 쓰면 됩니다. 예를 들어 List라는 이름의 리스트가 있고, 이 리스트의 모든 요소를 출력하고 싶다면 다음 한 줄이면 충분합니다. for(i in List){print(i)} 여기서 반복 변수 i는 인덱스 번호가 아니라 리스트에 담긴 각 벡터(요소) 자체를 순서대로 가리킵니다. 따라서 매 반복마다 해당 벡터 전체가 print() 함수를 통해 화면에 출력됩니다. 1. 예제용 리스트 만들기 실습을 위해 서로
행렬 M이 주어지고, M[r][c]는 해당 셀의 높이를 나타낸다고 가정해 보겠습니다. 우리는 현재 행렬의 왼쪽 위 모서리에 위치해 있으며, 오른쪽 아래 모서리로 이동하고자 합니다. 이때 인접한 셀(위, 아래, 왼쪽, 오른쪽)은 그 셀의 높이가 현재 셀의 높이보다 작거나 같을 경우에만 이동할 수 있습니다.흥미로운 점은 이동을 시작하기 전에 원하는 만큼 셀의 높이를 올릴 수 있다는 것입니다. 따라서 우리가 구해야 하는 값은, 오른쪽 아래 셀까지 도달할 수 있도록 하기 위해 증가시켜야 하는 높이의 최소 총합입니다.문제 예시예를 들어 입력
각 숫자가 해당 위치에서 최대로 점프할 수 있는 거리를 나타내는 숫자 리스트 nums가 주어졌다고 가정해 보겠습니다. 이때 인덱스 0에서 시작하여 마지막 인덱스에 도달할 수 있는지 판별하는 프로그램을 작성해야 합니다.예를 들어, 입력이 nums = [2,5,0,2,0]이라면 결과는 True입니다. 인덱스 0에서 인덱스 1로 점프한 뒤, 인덱스 1의 값이 5이므로 마지막 위치까지 한 번에 점프할 수 있기 때문입니다.해결 접근 방식이 문제는 동적 계획법(DP)을 이용해 배열의 끝에서부터 앞으로 거슬러 올라가며 해결할 수 있습니다. 핵심
문제 개요하나의 숫자 n이 주어졌을 때, 각 자릿수가 엄격하게 오름차순으로 배열된 n자리 양의 정수가 총 몇 개 존재하는지 구하는 프로그램을 만들어 보겠습니다.예를 들어 입력값이 n = 3이라면 출력은 84가 됩니다. 그 이유는 123, 124, 125, ..., 678, 789처럼 각 자릿수가 뒤로 갈수록 반드시 커지는 세 자리 수가 정확히 84개이기 때문입니다.풀이 접근 방법이 문제의 핵심은 조합(Combination) 개념에 있습니다. 엄격하게 증가하는 숫자를 만들 때 사용할 수 있는 자릿수는 1부터 9까지 총 9개뿐입니다.
이진 트리가 하나 주어졌을 때, 루트 노드부터 시작하는 중위 순회(Inorder Traversal) 결과를 리스트 형태로 반환하는 프로그램을 만들어 보겠습니다.중위 순회는 트리의 모든 노드를 다음과 같은 순서로 방문하는 순회 방식입니다.왼쪽 서브트리를 먼저 재귀적으로 순회합니다.현재 노드를 방문(처리)합니다.오른쪽 서브트리를 재귀적으로 순회합니다.일반적으로 중위 순회는 재귀 호출로 쉽게 구현할 수 있지만, 이번 글에서는 재귀 없이 스택을 활용한 반복(iterative) 방식으로 문제를 해결해 보겠습니다.문제 예시예를 들어 아래와 같
문제 개요 두 개의 연결 리스트 l1과 l2가 주어졌을 때, l1부터 시작하여 두 리스트의 노드를 번갈아 삽입(interleaving)해 하나의 연결 리스트를 만드는 문제입니다. 어느 한쪽 리스트에 노드가 남아 있으면, 남은 노드들은 결과 리스트의 끝에 그대로 이어 붙입니다. 예를 들어 입력이 l1 = [5,4,6,3,4,7], l2 = [8,6,9]라면, 두 리스트의 요소가 번갈아 배치된 [5,8,4,6,6,9,3,4,7]이 출력됩니다. 해결 접근 방법 핵심 아이디어는 포인터를 이용해 l2의 노드를 하나씩 꺼내 l1의 노드 사이사