목록Algorithm (16)
Hi
💡 기본 개념고정된 크기의 윈도우(구간)을 배열이나 문자열 위에서 일정 간격으로 이동시키며 문제를 해결하는 알고리즘 기법이다.윈도우를 이동할 때 전체를 다시 계산하지 않고, 앞 요소는 빼고 새 요소만 더하는 식으로 누적 계산시간복잡도는 O(n)💡 언제 사용할까?고정 길이의 부분 구간에서 최댓값, 최솟값, 합 등을 구할 때투 포인터와 유사하지만, 윈도우 크기를 고정하거나 유동적으로 움직이는 문제에서 효과적이다. ✅ 예시: 고정 크기 부분합 최대값 구하기def max_sum(arr, k): window_sum = sum(arr[:k]) max_sum = window_sum for i in range(k, len(arr)): window_sum += arr[i] - arr[i ..
항상 파이썬으로만 알고리즘을 풀다가 자바스크립트로 풀어봤다!입력 처리부터 에디터 사용 방식까지 많이 달라서 처음 시작하는 방법에 대해 정리해보려고 한다. 💡 input 받기파이썬으로 풀 때 매번 input값을 입력하는 게 귀찮아서 텍스트 파일을 만들어서 썼었다.import syssys.stdin=open('input.txt') 자바스크립트로 풀 때도 이 방법으로 풀면 꽤 편하다.단! 파이썬으로 문제 제출할 때는 해당 코드를 지워야 했었는데 자바스크립트는 코드 수정이 필요하다.const fs = require("fs");// 연습const input = fs.readFileSync("input.txt").toString().trim();// 백준 제출const input = fs.readFileSync(..
https://www.acmicpc.net/problem/11725 📌 문제 접근처음에 트리를 그린 후 부모를 찾으려고 하니, 기준이 없어서 도대체 부모를 어떻게 찾아야하나 한참 헤멨다.그러나 문제를 다시 읽어보니"루트는 1이다." 라는 조건이 있었다. (문제를 잘 읽자 .. )이걸 기반으로 1번 노드부터 탐색했다. 🔍 문제 풀이1. DFS 처음에는 DFS로 풀었다. 현재 노드에서 연결된 노드로 이동하면서,아직 방문하지 않은 노드에 대해 방문처리 + 부모 저장을 동시에 진행한다.하지만 RecursionError (런타임 에러) 가 발생해서 재귀제한을 늘려줘야했다. import syssys.setrecursionlimit(10**6)def dfs(n): if n > N+1: r..
https://www.acmicpc.net/problem/19949 🔹 접근 방법백트래킹을 이용해서 문제를 풀어야겠다고 생각했다.답을 선택하면 visited에 답을 저장해두고 3개 연속으로 같은 정답을 선택하지 않도록 했다.또한 답을 선택할때 정답일 경우 점수를 1점씩 올렸다. 🔹 코드 구현def dfs(n, score): global cnt # 10문제를 모두 푼 경우 if n >= len(answers): if score >= 5: cnt += 1 # 5개 이상 정답을 맞췄을 경우 카운트 증가 return for i in range(1, 6): # 1~5 중에서 선택 # 연속된 3개의 답이 같은 경우 제외 ..
https://www.acmicpc.net/problem/1149 처음에는 DFS를 사용하여 모든 경우의 수를 탐색하며 최소 비용을 찾으려고 했다. 그러나 백트래킹을 사용해도 탐색해야 할 경우의 수가 너무 많아 시간 초과가 발생했다. 따라서 DP를 이용하여 해결했다. 실패코드더보기def dfs(n, sm): global cost if n == N: if sm ✅ 성공코드N = int(input())house = [list(map(int, input().split())) for _ in range(N)]dp = [[0]*3 for _ in range(N)]dp[0] = house[0]for i in range(1, N): # 빨간 집 dp[i][0] = min(d..
https://www.acmicpc.net/problem/11048 문제 개요N×M 크기의 미로에서 (1,1) → (N,M)으로 이동할 때, 각 칸에 적혀 있는 사탕을 최대한 많이 먹을 수 있는 경우의 최대 사탕 개수를 구하는 문제이다. 이동은 오른쪽, 아래, 대각선 아래로만 가능하다.접근 방법DP를 활용하여 풀려고 했다.dp[i][j]를 (i, j)까지 도달했을 때 얻을 수 있는 최대 사탕 개수라고 정의한다.(i, j)에 도달하는 방법은 왼쪽(dp[i][j-1]), 위(dp[i-1][j]), 대각선 위(dp[i-1][j-1])에서 오는 경우가 있다.점화식은 아래와 같이 구했다dp[i][j]=maze[i][j]+max(dp[i−1][j],dp[i][j−1],dp[i−1][j−1])코드 구현N, M = ..
길이가 M 이상인 단어들의 수를 세서 조건에 맞게 정렬 하려고 했다.조건1. 자주 나오는 단어일수록 앞에 배치한다. => 개수 내림차순2. 해당 단어의 길이가 길수록 앞에 배치한다. => 길이 내림차순3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다 => 오름차순 계속 시간초과가 나서 input을 전부 한줄로 받은 다음 슬라이싱 했다.. import sysfrom collections import Counterinput = sys.stdin.readdata = input().splitlines()# print(data)# ['7 4', 'apple', 'ant', 'sand', 'apple', 'append', 'sand', 'sand']N, M = map(int, data[0].split()..
https://www.acmicpc.net/problem/1213 팰린드롬은 대칭 형태의 문자열이기 때문에 홀수개의 문자가 1개보다 많으면 안된다.그래서 딕셔너리의 값이 홀수일 경우를 세서 2 이상이면 종료시켰다. 처음에는 빈 문자열 두개에 문자를 넣고 뒷부분이 될 문자열만 역순으로 정렬하려고 했는데sorted로 정렬해야하니 문자열 → 리스트 → 문자열 순서로 정렬되어서 마음에 안들었다.그래서 그냥 앞 부분이 될 빈 문자열 하나와 뒷 부분이 될 빈 리스트 하나에 각각 문자를 넣었다.딕셔너리 값이 1인 경우에도 빈 문자열에 추가하였다.이후에 뒷부분 리스트는 역순으로 정렬해서 문자열로 만들었다. from collections import defaultdicttext = input()name = sorted(..