목록알고리즘 (32)
성장기록지

문제풀이N개의 회의를 진행할 때, 최대한 많은 회의를 진행할 수 있도록 선택하는 문제다. 각 회의는 시작 시간과 종료 시간이 주어지며, 한 회의가 끝나야 다음 회의를 시작할 수 있다.예를 들어, 입력값이5 1 4 2 3 3 5 5 7 6 8 이면,가능한 최대 회의 개수는 3개가 된다.접근 방법회의 정렬종료 시간이 빠른 순서대로 정렬한다.종료 시간이 같다면, 시작 시간이 빠른 순서대로 정렬한다.정렬하는 이유는 빨리 끝나는 회의를 선택해야 더 많은 회의를 배치할 수 있기 때문이다.회의 선택첫 번째 회의를 선택한다.이후, 현재 선택된 회의의 종료 시간 이후에 시작하는 회의를 찾아 선택한다.반복하여 최대 개수를 구한다.시간 복잡도 분석정렬 연산: O(NlogN)O(N \log N)O(NlogN)반복문을 통한 ..

문제 문제가 길다.. 풀이교실 초기화N×N 크기의 배열을 만들고, 배열의 바깥쪽을 -1로 채운다.이렇게 하면 인덱스 범위를 벗어나지 않고 편리하게 탐색할 수 있다.학생 배치 규칙학생을 한 명씩 배치하면서 다음의 조건을 만족하는 자리를 찾는다.좋아하는 친구가 인접한 자리주변 네 방향을 확인하여 좋아하는 친구가 가장 많이 있는 자리를 찾는다.비어 있는 칸이 많은 자리1번 조건을 만족하는 자리 중에서, 주변 네 방향에 비어 있는 칸이 가장 많은 자리를 선택한다.행과 열의 위치 기준2번 조건까지 만족하는 자리 중에서, 행 번호가 작은 곳, 행이 같다면 열 번호가 작은 곳을 선택한다.만족도 계산모든 학생이 배치된 후, 만족도를 계산한다.인접한 네 방향에 좋아하는 친구가 몇 명 있는지 확인하여 점수를 부여한다.1명..

문제풀이1. 입력 처리먼저 N, M과 격자 정보를 입력받는다.이후 초기 구름 위치를 설정한다.N, M을 입력받고, N×N 크기의 격자 배열을 생성한다.초기 구름 위치는 항상 (N-1, 0), (N-2, 0), (N-1, 1), (N-2, 1) 이다.2. 구름 이동 및 물 증가이동 방향과 거리를 입력받아, 모든 구름을 새로운 위치로 이동시킨다.이동 처리주어진 방향(d)에 따라 거리(s)만큼 이동한다.이동 시 경계를 넘는 경우 모듈러 연산을 이용해 격자 내에서 순환하도록 한다.물 증가구름이 이동한 위치에서 물의 양을 1 증가시킨다.3. 대각선 물 증가 마법물이 증가한 위치에서 대각선 방향으로 물이 존재하는 칸의 개수를 센 후, 해당 개수만큼 물을 추가한다.대각선 이동 방향: (↖, ↗, ↙, ↘) → dx[..

문제 풀이주어진 숫자 배열에서 연속된 정수로 이루어진 가장 긴 부분 수열을 찾는 문제다. 문제 이해배열 nums에 있는 정수들을 사용하여 연속된 숫자의 최장 길이를 구해야 한다.연속된 숫자란 값이 1씩 증가하는 수열을 의미한다.예를 들어, nums = [100, 4, 200, 1, 3, 2]이면연속된 숫자 수열: [1, 2, 3, 4]최장 길이: 4접근 방법중복 제거배열 내 중복된 숫자는 의미가 없으므로, set을 사용해 중복을 제거한다.이렇게 하면 숫자가 포함되어 있는지 빠르게 확인(O(1)) 할 수 있다.연속 수열의 시작점 찾기배열을 순회하면서, 현재 숫자에서 -1을 뺀 값이 존재하지 않는 경우를 찾는다.예를 들어, 1은 0이 없으므로 새로운 수열의 시작점이다.반면 3은 2가 있기 때문에 이미 포함된..

문제 풀이 주어진 2D 행렬을 대각선 방향으로 순회하며 모든 요소를 하나의 리스트로 반환하는 문제다.이때, 위쪽 방향(↗)과 아래쪽 방향(↙)을 번갈아가며 이동하는 규칙을 따른다.문제 이해행렬을 대각선 순서로 순회하며 좌상단에서 우하단까지 탐색한다.대각선 방향은 두 가지가 있다.위쪽 방향(↗): 왼쪽 아래에서 오른쪽 위로 이동아래쪽 방향(↙): 오른쪽 위에서 왼쪽 아래로 이동이동 도중 행렬 범위를 벗어날 경우, 방향을 바꾼다.최종적으로 탐색한 숫자들을 1차원 리스트로 반환한다.접근 방법이동 방향 정의위쪽 대각선(↗)으로 이동할 때는 행 -1, 열 +1아래쪽 대각선(↙)으로 이동할 때는 행 +1, 열 -1행렬 크기 변수 설정행 개수(n)와 열 개수(m)를 저장하여 행렬의 범위를 확인한다.초기값 설정처음에..

문제 풀이주어진 리스트에서 두 숫자의 합이 60으로 나누어떨어지는 쌍의 개수를 찾는 문제를 해결한다.이를 위해 각 숫자를 60으로 나눈 나머지를 활용하여 효율적으로 계산한다.우선, 딕셔너리를 사용해 각 숫자를 60으로 나눈 나머지 값들의 개수를 센다.이후, 특정 숫자의 나머지 값과 더했을 때 60이 되는 숫자의 개수를 곱하여 가능한 쌍의 개수를 구한다.예를 들어, 나머지가 10인 숫자가 3개 있고, 나머지가 50인 숫자가 2개 있다면, 이들은 각각 짝을 이룰 수 있으므로3 × 2 = 6개의 쌍이 만들어진다. 이런 방식으로 나머지 값이 1과 59, 2와 58처럼 서로 합이 60이 되는 쌍을 모두 계산한다.특별한 경우로, 나머지가 0이거나 30인 숫자들은 같은 나머지 값끼리만 짝을 이룰 수 있다. 따라서,..

문제 풀이투포인터를 활용할 수 있었지만, 누적 합으로 더 쉽게 풀 수 있는 문제였다.배열에서 홀수 개수가 정확히 k개인 연속 부분 배열(subarray) 개수를 구해야 하는 문제다. prefix_count라는 딕셔너리를 만들어 누적된 홀수 개수를 기록했다.처음에 prefix_count[0] = 1로 초기화해서, odd_count - k == 0인 경우도 처리할 수 있도록 했다.배열을 순회하면서 odd_count를 업데이트했다.현재 숫자가 홀수면 odd_count += 1을 해준다.odd_count - k가 존재하는 경우, 그 개수만큼 k개의 홀수를 포함하는 부분 배열이 있다는 뜻이므로 result에 더해준다.prefix_count를 갱신해 나갔다.현재 odd_count 값을 prefix_count에 추가..

문제풀이문제 분류는 스택으로 되어있어서 스택으로 풀으면 효율적인가 했지만, 다른 문제 풀이가 더 효율적이여서 이상했던 문제이다.우선 스택 문제풀이 과정이다.def solution(s): stack = [] for i in s: if len(stack) == 0 and i == ')': return False if i == ')' and stack[-1] == '(': stack.pop() if i == '(': stack.append('(') return False if len(stack) != 0 else True스택에 값이 0개일 때 ')'가 들어오면 바로 False를 반환하게 하고,for..

문제풀이스택,큐를 활용해 풀으라고 써있는데, 그냥 단순한 구현문제 같았다.작업에 걸리는 날짜를 date라는 리스트에 모아놓았다.작업에 걸리는 날짜는 소숫점 단위일때 올림을 해줘야 하므로 (예를들어 2.3이면 3으로)a를 b로 나눌 때 올림하는 공식인 (a+b-1 // b) 를 활용하였다.그다음 date를 순회하며 처음에 max_num 에 작업이 걸리는시간을 넣어준다.이후 이전 작업보다 이후 작업에서 걸리는 날짜가 많을경우에 max_num을 갱신하고, answer 리스트에 답을 추가해주고,count를 0으로 초기화해준다.아닐 경우에는 count 변수를 증가시켜주는 식으로 문제를 풀었다.O(N)으로 문제를 해결할 수 있었다. 코드def solution(progresses, speeds): answer ..

문제풀이이 코드는 파이어볼을 이동시키고, 충돌 시 합쳐지는 로직을 구현한 시뮬레이션 문제다.기본적으로 arr이라는 2차원 리스트를 사용해 각 좌표에 있는 파이어볼 정보를 저장한다. 초기에는 파이어볼의 위치와 정보를 입력받아 fireballs 리스트에 저장하고, 이후 K번의 이동을 수행한다.파이어볼 이동각 파이어볼을 현재 위치에서 방향과 속력에 따라 이동시킨다. 격자를 벗어나지 않도록 N으로 나눈 나머지를 이용해 위치를 조정한다.이동한 파이어볼을 다시 저장이동이 끝난 후, 새로운 위치에 파이어볼 정보를 저장한다.파이어볼 합치기같은 위치에 여러 개의 파이어볼이 모이면,질량과 속력을 합산하여 새로운 파이어볼을 만든다.원래 방향이 모두 홀수이거나 모두 짝수이면 [0, 2, 4, 6] 방향으로 나누고, 그렇지 않..