숫자 리스트 nums가 주어졌다고 가정해 보겠습니다. 이 리스트는 정사각형 블록들의 높이를 나타내며, 우리가 확인해야 할 것은 이 블록들이 이루는 전체 형태가 y = x 직선을 기준으로 대칭인지 여부입니다.예를 들어 입력이 nums = [7, 5, 3, 2, 2, 1, 1]이라면, 이 블록 형태는 y = x 선에 대해 대칭이므로 출력은 True가 됩니다.문제 해결 접근 방법y = x 축 대칭에서는 좌표 (i, j)에 블록이 존재한다면 좌표 (j, i)에도 반드시 블록이 존재해야 합니다. 이 성질을 이용해 오른쪽 끝 열부터 왼쪽으로
리스트의 리스트로 구성된 rooms가 주어졌다고 가정해 봅시다. 각 인덱스 i는 하나의 방을 나타내며, rooms[i]에는 다른 방을 열 수 있는 열쇠들이 담겨 있습니다. 0번 방은 처음부터 열려 있고 우리는 그 방에서 시작하며, 나머지 방들은 모두 잠겨 있습니다. 열린 방 사이는 자유롭게 이동할 수 있을 때, 모든 방을 열 수 있는지 확인해야 합니다.예를 들어 입력이 rooms = [[2, 0], [3], [1], []]라면 결과는 True입니다. 0번 방에서 시작해 열쇠 2번으로 2번 방에 들어가고, 2번 방의 열쇠로 1번 방을
n × n 크기의 행렬이 하나의 체스판을 나타낸다고 가정해 봅시다. 행렬에는 1과 0만 존재하며, 1은 퀸(Queen)이 있는 칸, 0은 빈 칸을 의미합니다. 우리가 확인해야 할 것은 이 체스판이 N-퀸(N-Queen) 퍼즐의 유효한 해답인지 여부입니다.N-퀸 문제에서 유효한 해답이 되려면 어떤 두 퀸도 서로를 공격할 수 없는 위치에 있어야 합니다. 즉, 같은 행, 같은 열, 같은 대각선 위에 두 개 이상의 퀸이 존재해서는 안 됩니다.예를 들어 다음과 같은 입력이 주어졌을 때,출력 결과는 True가 됩니다.문제 해결 접근 방식이 문
2부터 9까지의 숫자로 이루어진 문자열이 주어졌을 때, 해당 숫자들이 만들어낼 수 있는 모든 문자 조합을 찾는 문제를 생각해 봅시다. 각 숫자에 대응되는 문자 매핑은 일반적인 전화기 키패드와 동일하며, 아래 표와 같습니다. 참고로 숫자 1은 어떤 문자에도 매핑되지 않습니다. 12a b c3d e f 4g h i5j k l6m n o 7p q r s8t u v9w x y z *0# 예를 들어 입력 문자열이 49라면, 숫자 4는 g, h, i에 대응하고 숫자 9는 w, x, y, z에 대응하므로 가능한 결과는 다음과 같습니다.
시간 순서대로 나열된 어떤 회사의 일별 주가를 담고 있는 가격 리스트가 있다고 가정해 보겠습니다. 이때 원본 리스트와 길이가 같은 새로운 리스트를 만들어야 하며, 새 리스트의 인덱스 i에 해당하는 값은 해당 날짜부터 이익을 얻을 때까지 기다려야 하는 최소 일수입니다. 만약 어떤 방법으로도 이익을 얻을 수 없다면 그 값은 0이 됩니다.예를 들어 입력이 prices = [4, 3, 5, 9, 7, 6]이라면 출력은 [2, 1, 1, 0, 0, 0]이 됩니다. 첫째 날의 가격 4는 이틀 뒤 가격 5에서 수익을 낼 수 있으므로 2가 되고,
hh:mm 형식의 24시간제 시간 문자열이 주어졌을 때, 해당 문자열에 포함된 숫자들을 재사용하여 만들 수 있는 다음으로 가장 가까운 시간을 찾는 문제입니다. 여기서 중요한 점은 주어진 숫자를 원하는 만큼 여러 번 반복해서 사용할 수 있다는 것입니다.예를 들어 입력이 s = 03:15라면, 출력은 03:30이 됩니다. 주어진 숫자(0, 3, 1, 5)만으로 만들 수 있는 시간 중 03:15 바로 다음에 오는 시간이 03:30이기 때문입니다.문제 해결 접근 방법이 문제는 백트래킹(backtracking) 기법을 사용하여 해결할 수 있
문자열로 이루어진 리스트가 있다고 가정해 보겠습니다. 이때 찾아야 할 것은 리스트 안에 있는 다른 단어들을 연결(concatenate)하여 만들어진 단어의 개수입니다. 연결 과정에서 이미 사용한 단어를 다시 재사용할 수 있으며, 원하는 만큼 몇 번이고 연결해도 괜찮습니다. 예를 들어 입력이 다음과 같다면, words = [hello, world, helloworld, famous, worldfamous, programming] 출력은 2가 됩니다. 그 이유는 다음과 같습니다. helloworld는 hello와 world를 연결한
단어 목록(words)과 문자열(letters)이 주어졌을 때, 주어진 문자들을 재배열하여 만들 수 있는 가장 긴 단어의 길이를 찾는 프로그램을 작성해야 합니다. 여기서 letters에는 별표(*)가 포함될 수 있으며, 별표는 어떤 문자와도 매칭되는 와일드카드 역할을 합니다. 또한 주어진 모든 문자를 반드시 사용할 필요는 없습니다.예를 들어, 입력이 words = ["prince", "rice", "price", "limit", "hello"]
문제 소개 이진 트리가 하나 주어졌을 때, 왼쪽 자식과 오른쪽 자식을 번갈아 이동하면서 아래 방향으로만 내려가는 경로 중 가장 긴 것의 길이를 찾아야 합니다. 이러한 경로는 일반적으로 지그재그 경로(ZigZag Path)라고 불립니다. 예를 들어 아래와 같은 트리가 입력으로 주어진 경우를 살펴보겠습니다. 이때 정답은 5입니다. [2 → 4 → 5 → 7 → 8] 경로가 오른쪽 → 왼쪽 → 오른쪽 → 왼쪽으로 방향을 번갈아 가며 내려가는 가장 긴 교대 경로이기 때문입니다. 풀이 접근 방법 이 문제는 깊이 우선 탐색(DFS)으로 깔
문제 이해하기문자열 s와 정수 k가 주어졌을 때, 문자열의 각 문자를 대각선 방향으로 왼쪽 위에서 오른쪽 아래로 이동하며 배치하다가 k번째 줄에 도달하면 다시 오른쪽 위 방향으로 올라가는 방식으로 새로운 문자열을 만들어야 합니다. 즉, 문자를 지그재그(zigzag) 형태로 배치한 결과를 구하는 것이 목표입니다.예를 들어 입력이 s = ilovepythonprogramming, k = 5라면 출력은 다음과 같습니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.각 줄별로 문자를 저장할 맵(line)을 하나 생성합니다.
문제 개요항구(port) 네트워크에서 배송 작업의 총비용을 계산하는 문제를 살펴보겠습니다. ports라는 리스트가 주어지며, ports[i]는 i번 항구와 직접 연결된 항구들의 목록을 나타냅니다. 또 다른 리스트인 shipments에는 배송 요청 정보가 담겨 있고, 각 요청은 [i, j] 형태로 표현되어 i번 항구에서 j번 항구로 화물을 보내야 함을 의미합니다.이때 i번 항구에서 j번 항구로 배송하는 비용은 두 항구 사이의 최단 경로 길이이며, 우리는 모든 배송 요청을 완료하기 위해 필요한 총비용을 구해야 합니다.예를 들어, 다음과
문제 개요방향 그래프(directed graph)의 인접 리스트(adjacency list)가 주어진다고 가정해 봅시다. 각 인덱스 i에 있는 리스트는 노드 i에서 연결되는 노드들을 나타냅니다. 여기에 목표 값(target)도 함께 주어지며, 우리가 구해야 할 것은 이 target 노드를 포함하는 가장 짧은 사이클의 길이입니다. 만약 해당하는 사이클이 존재하지 않는다면 -1을 반환하면 됩니다.예를 들어 아래와 같은 그래프가 입력으로 주어졌다고 하겠습니다.이때 target = 3이라면 출력 결과는 3이 됩니다. 그 이유는 노드 1 →
숫자 리스트 nums가 있다고 가정해 봅시다. 각 값은 함께 스카이다이빙을 하고자 하는 그룹의 인원수를 나타냅니다. 또 다른 값 k는 스카이다이빙을 신청할 수 있는 총 일수를 의미합니다. 우리의 목표는 k일 이내에 모든 요청을 처리할 수 있는 비행기의 최소 탑승 정원을 구하는 것입니다.단, 두 가지 제약 조건이 있습니다.요청은 주어진 순서대로 처리되어야 합니다.비행기는 하루에 한 번만 운항할 수 있습니다.예를 들어 입력이 nums = [16, 12, 18, 11, 13], k = 3이라면 출력은 28이 됩니다. 28인승 비행기를 사
문제 개요숫자로 이루어진 리스트 nums가 주어집니다. 각 숫자는 로켓의 크기와 방향을 동시에 나타내며, 양수는 오른쪽으로 이동하는 로켓을, 음수는 왼쪽으로 이동하는 로켓을 의미합니다. 숫자의 절댓값은 로켓의 크기를 뜻합니다.두 로켓이 충돌할 때 적용되는 규칙은 다음과 같습니다.크기가 다른 두 로켓이 충돌하면 작은 로켓은 파괴되고, 큰 로켓은 그대로 여행을 계속합니다.크기가 같은 두 로켓이 충돌하면 둘 다 파괴됩니다.같은 방향으로 이동하는 로켓끼리는 절대 충돌하지 않습니다(속도가 모두 같다고 가정).목표는 모든 충돌이 끝난 후 남아
문제 소개2차원 이진 행렬(0과 1로만 구성된 행렬)이 주어졌을 때, 모든 원소가 1로 이루어진 정사각형 부분 행렬의 총 개수를 구하는 프로그램을 만들어 보겠습니다.예를 들어 입력이 다음과 같다고 가정해 봅시다.11101110111000001011이 경우 출력은 17이 됩니다. 크기가 1×1인 정사각형이 12개, 2×2인 정사각형이 4개, 3×3인 정사각형이 1개 존재하기 때문입니다.풀이 접근 방식: 동적 계획법이 문제는 동적 계획법(Dynamic Programming)을 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다
숫자 리스트 pushes와 또 다른 숫자 리스트 pops가 있다고 가정해 보겠습니다. 이때 두 리스트가 실제 스택(Stack)에서 수행 가능한 유효한 푸시(push)·팝(pop) 연산 순서인지 확인해야 합니다.예를 들어 입력이 pushes = [1, 2, 5, 7, 9], pops = [2, 1, 9, 7, 5]라고 한다면 결과는 True입니다. 먼저 1과 2를 차례로 푸시한 뒤 두 요소를 모두 팝하고, 이어서 5, 7, 9를 푸시한 후 역순으로 모두 팝하면 되기 때문입니다.문제 해결 접근 방식이 문제는 실제 스택을 하나 만들어 시
시간 간격이 동일하게 떨어진 시점에서 자동차의 위치를 나타내는 숫자 리스트가 있다고 가정해 보겠습니다. 이때 자동차가 일정한 속도(등속)로 주행한 가장 긴 부분 리스트(sublist)의 크기를 구하는 것이 목표입니다.예를 들어 입력이 다음과 같다면,positions = [0, 4, 8, 12, 6, 4, 0]부분 리스트 [0, 4, 8, 12]에서 인접한 위치 사이의 거리가 모두 4로 일정하므로, 결과는 4가 됩니다.해결 접근 방식이 문제는 리스트를 한 번만 순회하면서 인접한 두 위치 사이의 거리가 이전 구간의 거리와 같은지 비교하
스테핑 넘버(Stepping Number)란 인접한 모든 자릿수 사이의 절대적인 차이가 정확히 1인 수를 의미합니다. 예를 들어 123은 각 자릿수의 차이가 1씩 나므로 스테핑 넘버에 해당하지만, 124는 2와 4의 차이가 2이므로 스테핑 넘버가 아닙니다. 문제 정의 숫자 n이 주어졌을 때, n자리 스테핑 넘버의 총 개수를 구하는 프로그램을 작성해야 합니다. 결과값이 매우 커질 수 있으므로 10^9 + 7로 나눈 나머지를 반환하도록 합니다. 예를 들어 입력이 n = 2일 때 출력은 17입니다. 두 자리 스테핑 넘버는 다음과 같이
문제 설명 각 문자열이 문자 A와 B로만 구성된 문자열 리스트가 있다고 가정해 보겠습니다. 두 정수 a와 b가 주어질 때, 만들 수 있는 문자열의 최대 개수를 구하는 것이 목표입니다. 각 문자열은 한 번만 선택할 수 있으며, 전체적으로 사용되는 A는 최대 a개, B는 최대 b개로 제한됩니다. 예를 들어 입력이 strings = [AAABB, AABB, AA, BB], a = 4, b = 2라면 출력은 2가 됩니다. 4개의 A와 2개의 B를 사용해 [AABB, AA] 두 문자열을 선택할 수 있기 때문입니다. 접근 방법 이 문제는 잘
nums라는 숫자 리스트가 주어졌다고 가정해 보겠습니다. 리스트의 각 숫자는 특정 후보에게 던진 한 표를 나타냅니다. 이때 전체 표 수 n의 1/3, 즉 floor(n/3)(n÷3의 몫)보다 많은 표를 얻은 후보들의 id를 오름차순으로 구하는 것이 이번 문제입니다.예를 들어 입력이 nums = [3, 2, 6, 6, 6, 6, 7, 7, 7, 7, 7]이라면 결과는 [6, 7]이 됩니다. 총 11표 중 후보 6은 4표, 후보 7은 5표를 얻어 두 후보 모두 n/3(약 3.67표)을 초과하는 득표율을 기록했기 때문입니다.해결 접근 방