문제 설명 소문자 알파벳과 ? 문자로만 이루어진 문자열 s가 있다고 가정해 보겠습니다. 이때 모든 ?를 소문자 알파벳으로 바꿔서, 최종 문자열에는 같은 문자가 연속해서 나타나지 않도록 만들어야 합니다. 조건을 만족하는 답이 여러 개라면 그중 무엇을 반환해도 괜찮습니다. 예를 들어 입력이 s = "hel??"라면 출력은 "helab"이 될 수 있습니다. 첫 번째 물음표는 바로 앞의 l과만 다르면 되고, 그 자리가 정해진 뒤에는 두 번째 물음표가 새로 생긴 앞 문자와만 다르면 되기 때문입니다. 접근
m x n 크기의 이진 행렬(binary matrix)이 주어졌을 때, 행렬 안에서 특수 위치(special position)의 개수를 구하는 문제입니다. 여기서 특수 위치란 다음 조건을 만족하는 좌표 (i, j)를 의미합니다.mat[i][j]의 값이 1이다i번째 행과 j번째 열에 있는 나머지 모든 요소가 0이다예를 들어 아래와 같은 행렬이 입력으로 주어진다고 가정해 보겠습니다.10000001000001101000이 경우 출력은 3이 됩니다. 특수 위치는 (0, 0), (1, 2), (3, 1) 세 곳이기 때문입니다. 각 위치의 값
문제 개요 양수로만 이루어진 배열 nums가 주어졌을 때, 가능한 모든 홀수 길이 부분 배열(subarray)의 합을 구하는 프로그램을 만들어 보겠습니다. 여기서 부분 배열이란 원본 배열에서 연속된 요소들로 구성된 부분 수열을 의미합니다. 즉, 길이가 1, 3, 5처럼 홀수인 모든 연속 구간의 합을 모두 더하는 것이 목표입니다. 예제 살펴보기 예를 들어 입력이 nums = [3, 8, 2, 5, 7]이라면, 홀수 길이를 가지는 부분 배열은 다음과 같습니다. nums[0] = 3 nums[1] = 8 nums[2] = 2 nums[
문제 소개문자열 s에 여러 개의 단어가 있고, 단어들 사이에는 하나 이상의 공백이 포함되어 있다고 가정해 봅시다. 우리가 해야 할 일은 이 공백들을 재배치하여 인접한 모든 단어 쌍 사이에 동일한 개수의 공백이 오도록 만드는 것입니다. 또한 단어 사이의 공백 개수를 최대한 많이 확보해야 합니다.만약 전체 공백을 단어들 사이에 균등하게 나눌 수 없다면, 남은 공백은 문자열의 맨 뒤에 추가하면 됩니다.예를 들어 입력이 다음과 같다고 해보겠습니다.s = I love programming 이 경우 출력 결과는 아래와 같습니다. 단어 사이마
폴더에 진입하는 경로가 담긴 로그(logs) 목록이 있다고 가정해 보겠습니다. 각 로그 항목은 다음 세 가지 기호 중 하나를 나타냅니다.../ : 현재 폴더에서 상위(부모) 폴더로 이동합니다. 이미 메인 폴더에 있다면 위치는 그대로 유지됩니다../ : 현재 폴더에 그대로 머뭅니다.x/ : 이름이 x인 하위(자식) 폴더로 이동합니다.문제의 목표는 주어진 로그를 순서대로 실행한 뒤, 마지막으로 도착한 폴더에서 메인(홈) 폴더로 돌아가기 위해 필요한 최소 연산 횟수를 구하는 것입니다.예를 들어 입력이 logs = [Dir1/,Dir2/,
주차 시스템을 설계한다고 가정해 봅시다. 이 주차장에는 대형(big), 중형(medium), 소형(small) 세 가지 종류의 주차 공간이 있으며, 각 크기별로 정해진 수의 주차 슬롯이 존재합니다.이 문제는 두 개의 메서드를 가진 OurParkingSystem 클래스를 만드는 것입니다.생성자 constructor(big, medium, small) — 각 크기별로 사용 가능한 주차 슬롯의 개수를 인자로 받아 OurParkingSystem 객체를 초기화합니다.addCar(carType) — 주차장에 들어오려는 차량에 대해 해당 car
문제 개요모든 요소가 0 또는 양수로만 이루어진 배열 nums가 있다고 가정해 봅시다. 만약 어떤 수 x에 대해 배열 안에 x보다 크거나 같은 요소가 정확히 x개 존재한다면, 이 배열을 특수 배열(special array)이라고 부릅니다. 여기서 중요한 점은 x가 반드시 배열의 요소일 필요는 없다는 것입니다.배열이 특수 배열이라면 조건을 만족하는 x를 찾아 반환하고, 그런 값이 존재하지 않는다면 -1을 반환하면 됩니다.예시예를 들어 입력이 nums = [4, 6, 7, 7, 1, 0]이라면 결과는 4입니다. 배열에서 4보다 크거나
문제 개요nums라는 배열이 주어졌다고 가정해 보겠습니다. 이때 가장 작은 5%와 가장 큰 5%에 해당하는 요소들을 제거한 뒤, 남은 값들의 평균을 구하는 것이 목표입니다.예를 들어 입력이 nums = [2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8]과 같다면, 가장 작은 값과 가장 큰 값을 제거한 후 남은 값들이 모두 4로 동일하므로 결과는 4.0이 됩니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.nums 리스트를 오름차순으로 정렬합니다.n := nums의 크기를 저장합니다.per :
문자열 s가 주어졌을 때, 서로 같은 두 문자 사이에 위치한 부분 문자열 중 가장 긴 것의 길이를 구하는 문제입니다. 단, 양 끝에 있는 두 문자 자체는 길이 계산에서 제외하며, 조건을 만족하는 부분 문자열이 존재하지 않으면 -1을 반환해야 합니다.예를 들어 입력이 s = level이라면 출력은 3이 됩니다. 첫 번째 l(인덱스 0)과 마지막 l(인덱스 4) 사이의 부분 문자열은 eve이고, 그 길이가 3이기 때문입니다.문제 해결 접근 방식핵심 아이디어는 간단합니다. 각 문자가 처음 등장한 인덱스와 마지막에 등장한 인덱스의 차이가
문제 개요어떤 배열에는 동일한 요소가 여러 번 나타날 수 있습니다. 이때 배열을 각 요소의 등장 빈도가 증가하는 순서로 정렬하려고 합니다. 즉, 덜 자주 나타나는 요소일수록 앞쪽에 배치되고, 빈도가 같은 요소들 사이에서는 값이 큰 요소가 먼저 오도록 정렬하는 것입니다.예를 들어 입력이 다음과 같다면,nums = [1,5,3,1,3,1,2,5]출력은 아래와 같습니다.[2, 5, 5, 3, 3, 1, 1, 1]그 이유를 살펴보면 다음과 같습니다.2는 1번 등장5와 3은 각각 2번 등장 (같은 빈도일 때는 값이 큰 5가 먼저)1은 3번
모든 요소가 고유한 배열 nums와, 여러 개의 작은 배열들을 담고 있는 또 다른 배열 pieces가 있다고 가정해 보겠습니다. 이때 pieces에 포함된 배열들을 임의의 순서로 이어 붙여(concatenate) 원래 배열 nums를 만들 수 있는지 확인해야 합니다.단, 중요한 제약 조건이 하나 있습니다. 각 조각 pieces[i] 내부에 있는 요소들의 순서는 절대 변경할 수 없다는 것입니다. 즉, 조각 자체를 회전하거나 뒤집는 것은 허용되지 않으며, 조각들을 배치하는 순서만 자유롭게 정할 수 있습니다.예제입력이 다음과 같다고 해보
문제 설명 숫자 n이 주어졌을 때, 다음 규칙에 따라 길이가 n+1인 배열 A를 생성해야 합니다. A[0] = 0 A[1] = 1 2 ≤ 2×i ≤ n일 때, A[2×i] = A[i] 2 ≤ 2×i+1 ≤ n일 때, A[2×i+1] = A[i] + A[i+1] 배열 생성이 완료되면, 배열 안에서 가장 큰 값을 찾아 반환하면 됩니다. 예시 n = 5가 입력으로 주어지면 결과는 3이 됩니다. 실제로 배열을 하나씩 만들어 보면 다음과 같습니다. A[0] = 0 A[1] = 1 A[2] = A[1] = 1 A[3] = A[1] +
문제 개요폭탄을 해체해야 하는 아슬아슬한 상황을 상상해 보세요! 시간은 촉박하게 흐르는 가운데, 우리에게는 길이가 n인 원형 배열(circular array) code와 정수 키 k가 주어집니다. 암호를 해독하려면 배열의 모든 숫자를 동시에 새로운 값으로 교체해야 하며, 다음 세 가지 규칙을 따라야 합니다.k > 0인 경우: i번째 숫자를 그 뒤에 있는 k개 숫자의 합으로 교체합니다.k < 0인 경우: i번째 숫자를 그 앞에 있는 |k|개 숫자의 합으로 교체합니다.k = 0인 경우: i번째 숫자를 단순히 0으로 교체합니다
두 개의 문자열 배열 word1과 word2가 주어졌을 때, 이 두 배열이 서로 같은 문자열을 나타내는지 확인해야 하는 문제입니다. 배열의 요소들이 순서대로 이어 붙여져(concatenate) 하나의 문자열을 형성할 수 있다면, 그 문자열은 해당 배열로 표현된다고 말할 수 있습니다.예를 들어 입력이 다음과 같다면,word1 = [ko, lka, ta]word2 = [k, olk, at, a]두 배열 모두 요소를 순서대로 연결하면 kolkata라는 동일한 문자열이 되므로, 출력 결과는 True가 됩니다.문제 해결 접근 방법이 문제는
문제 이해하기문자 시퀀스 s가 주어졌을 때, 문자열 w를 k번 이어 붙인 결과가 s의 부분 문자열이 된다면 w를 k-반복(k-repeating) 문자열이라고 정의합니다. 이때 w의 최대 k-반복 값은 w가 s 안에서 반복될 수 있는 가장 큰 k를 의미합니다. 만약 w가 s의 부분 문자열이 아니라면 최대 k-반복 값은 0이 됩니다.예를 들어 s = papaya, w = pa라고 가정해 보겠습니다. pa가 papaya 안에 두 번 포함되어 있으므로 출력 결과는 2가 됩니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.
m × n 크기의 행렬 accounts가 있다고 가정해 보겠습니다. 여기서 accounts[i][j]는 i번째 고객이 j번째 은행에 보유하고 있는 금액을 의미합니다. 우리의 목표는 가장 부유한 고객의 자산 총액을 구하는 것입니다. 여기서 가장 부유한 고객이란 모든 은행에 보유한 자산을 합산했을 때 금액이 가장 큰 고객을 말합니다.예를 들어 입력이 다음과 같다면:102015305201051215123출력은 55가 됩니다. 두 번째 고객의 자산은 30 + 5 + 20 = 55로 네 명 중 가장 크기 때문입니다.문제 해결 접근 방법이 문
n개의 학생 그룹이 대학 버스를 타고 집에 돌아가기 위해 기다리고 있다고 가정해 보겠습니다. 각 그룹에는 m명의 학생이 있으며, 그룹들은 절대 흩어지지 않고 함께 이동하려고 합니다. 즉, 그룹의 모든 멤버가 버스에 탑승할 수 있을 때만 해당 그룹이 버스에 오를 수 있습니다. 또한 그룹은 반드시 순서대로 탑승해야 하므로, 특정 그룹을 건너뛰고 다음 그룹을 먼저 태울 수는 없습니다.이때 그룹의 수와 각 그룹의 학생 수가 주어졌다면, 다음 두 조건을 만족하는 버스의 크기를 찾아야 합니다.버스가 모든 그룹을 운송할 수 있어야 한다버스가 대
문제 이해하기(x, y) 형태로 표현되는 여러 개의 쌍이 주어졌다고 가정해 보겠습니다. 여기서 x는 해당 수의 진법(base)을 의미하고, y는 실제 숫자 값을 나타냅니다. 서로 다른 진법으로 표현되었지만 실제로는 같은 값을 가지는 쌍들이 목록 속에 존재할 수 있으며, 우리는 주어진 쌍들 중에서 값이 일치하는 경우가 몇 개인지 확인해야 합니다. 단, 입력에는 중복된 쌍이 포함될 수 있고, 유효하지 않은 진법과 숫자의 조합도 섞여 있을 수 있습니다.예를 들어 입력이 num_inputs = 2, input_arr = [(10, 15),
문제 설명 어떤 사람이 가격이 x인 제품을 구매하려고 합니다. 그런데 하루가 지날 때마다 제품의 가격은 전날 가격의 x배 수준으로 빠르게 올라갑니다. 우리가 구해야 할 값은, 이 사람이 구매를 결심한 시점부터 y일 후의 제품 가격입니다. 가격이 지수적으로 증가하기 때문에 숫자가 감당하기 어려울 만큼 커질 수 있으므로, 답은 10⁹ + 7로 나눈 나머지(modulo)로 출력합니다. 입력은 쌍(pair)의 리스트 형태로 주어집니다. 각 쌍에서 첫 번째 값은 초기 가격 x, 두 번째 값은 경과한 일수 y를 의미합니다. 입출력 예시 예를
문제 개요 서로 다른 길이를 가진 여러 개의 금속 막대를 운송해야 하는 상황을 가정해 봅시다. 그런데 운송용 컨테이너의 길이가 짧아서 길이가 1인 막대만 담을 수 있습니다. n개의 막대가 주어지고, 각 막대의 길이는 리스트 형태로 제공됩니다. 모든 막대를 컨테이너에 넣으려면 먼저 모든 막대를 잘라 단위 길이(1)로 만들어야 하며, 이후 잘라 놓은 막대들을 컨테이너에 포장하는 데 한 번의 작업(operation)이 소요됩니다. 우리가 구해야 할 것은 바로 이 과정에서 필요한 총 작업 횟수입니다. 예시로 이해하기 입력이 input_ar