일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- DFS
- 애드 혹
- 세그먼트 트리
- JavaScript
- boj
- 슬라이딩 윈도우
- 플로이드-워셜
- 이분 탐색
- 문자열
- Python
- BFS
- 브루트포스
- 누적 합
- 그리디
- 트리
- SSAFY
- 2357
- 해시 테이블
- 에라토스테네스의 체
- 그래프
- 구현
- 13164
- 싸피
- 투 포인터
- 맵
- DP
- 수학
- 정렬
- 모던 JavaScript 튜토리얼
- 정수론
- Today
- Total
목록Python (194)
흙금이네 블로그
아이디어 위쪽, 왼쪽, 오른쪽의 가능한 지역 중 최대 가치를 더해 나간다. 풀이 입력 받은 N, M을 저장하고, 첫 행을 입력 받아 리스트 dp에 저장한다. 첫 행의 지역들은 시작 지점을 제외하고는 왼쪽 지역을 탐사해야 이동할 수 있으므로, dp를 오른쪽으로 누적하여 더한다. 첫 행과 마지막 행의 지역들을 제외한 지역들을 처리하기 위해 N-2의 크기로 for문을 실행한다(N > 2일 때 실행). 우선 현재 행을 arr에 입력 받고, arr과 같은 크기로 0이 채워진 리스트 temp를 생성한다. temp에는 왼쪽에서 오른쪽으로 탐사해 나갈 때의 최대 가치를 저장한다. temp의 첫 번째 값은 arr의 첫 번째 값(현재 지역 가치)과 dp의 첫 번째 값(위쪽 지역 최대 누적 가치)의 합으로 저장하고, 나머지..
아이디어 시간에 맞게 입장과 퇴장이 모두 확인된 학회원들을 찾는다. 풀이 #1 (Python) 개강총회 시작 시간 S, 개강총회 종료 시간 E, 스트리밍 종료 시간 Q를 모두 문자열로 입력 받는다. 테스트 케이스 수가 따로 주어지지 않으므로 try except문으로 입력이 주어지는 동안 while문을 반복한다. 시간은 T, 이름은 name에 문자열로 저장하고, T가 S 이하이면 딕셔너리 names에 name을 1로 저장한다. T가 E 이상 Q 이하이면서 names에 값이 있으면 중복 계산 방지를 위해 해당 값을 0으로 바꾸고 결과값 res를 증가시킨다. 문자열의 대소 비교에서는 순서대로 각 문자열 문자들의 아스키 코드 값으로 대소 비교가 된다. import sys input = sys.stdin.read..
아이디어 DFS로 각 지역에서 이동할 수 있는 최대 경로 길이를 저장해 나간 후, 숲에서의 최대 경로 길이를 구한다. 풀이 함수를 이용한 DFS를 위해 sys.setrecursionlimit으로 최대 재귀 깊이를 최대 대나무 숲의 크기인 500*500로 설정한다. 상하좌우로 이동하는 행열 변화 값을 리스트 delta에 저장하고, 숲의 크기를 n, 숲 정보를 2차원 리스트 forest에 저장한다. 방문 표시 및 최대 경로 길이를 저장하는 2차원 리스트 visited와 결과값을 저장하는 res를 만든다. 이중 for문을 돌며 각 칸에 대해 함수 dfs를 호출하는데, 해당 칸을 방문한 적이 있으면 함수를 바로 종료한다. 방문한 적이 없으면 해당 칸 방문 표시 이후, 현재 칸보다 대나무가 더 많은 근처 칸에 대..
아이디어 순서대로 T에서 S의 문자들을 찾아 나간다. 풀이 #1 (Python) 테스트 케이스 수가 따로 주어지지 않으므로 sys.stdin.readlines으로 입력 값을 모두 읽는다. 각 테스트 케이스에서 find 메서드로 T에서 찾은 문자열 S의 문자들 인덱스를 차례로 idx에 저장하고, 그 다음 문자는 그 이후 인덱스부터 찾아 나가는 식으로 for문을 반복한다. 도중에 S의 문자가 T에 존재하지 않아 idx가 -1이 되면 No를 출력하고, S의 문자들을 모두 찾는 경우 Yes를 출력한다. import sys input = sys.stdin.readlines for case in input(): S, T = case.split() idx = -1 for c in S: idx = T.find(c, i..
아이디어 동적 계획법으로 남은 a와 z의 개수에 따른 조합의 수를 구한 후, 이분 탐색의 원리로 문자열을 찾아 나간다. 풀이 행은 a의 남은 개수, 열은 z의 남은 개수를 의미하는 (N+1)*(M+1) 크기의 2차원 리스트 dp를 만든다. 한 문자가 0개 남았을 때는 다른 문자 개수와 상관없이 모두 다른 문자로 채워지는 한 가지 경우이므로 1로 초기화한다. 두 문자 모두 0개 남은 dp[0][0]은 경우의 수로는 0이 맞으나 이후 코드에서 발생하는 예외를 위해 1로 채운다. K가 주어진 문자 a와 z로 조합할 수 있는 단어 수의 범위를 넘어서면 -1을 출력한다. 그렇지 않으면 i는 N-1, j는 M부터 두 값이 모두 0 이상일 동안 while문을 반복하며 결과값 res를 채워 나간다. a는 z보다 사전순..
아이디어 #1 2차원 리스트의 행마다 한 줄씩 입력 받고, 출력 시에는 열을 우선으로 탐색한다. 풀이 #1 (Python) 빈 리스트 li를 만들고 인덱스 에러 방지를 위해 입력 받은 문자열 끝에 14개의 별 문자를 붙여 li에 추가한다. 빈 문자열 res를 만들고, 이중 for문에서 열을 우선으로 li를 탐색하며 별 문자가 아닌 문자를 res에 붙여 나간다. li = [] for _ in range(5): S = input() li.append(S+'*'*14) res = '' for j in range(15): for i in range(5): if li[i][j] != '*': res += li[i][j] print(res) 풀이 #2 (JavaScript) 풀이 #1 코드와 마찬가지 원리로 동작한..
아이디어 A와 B를 XOR했을 때 0이 나오려면 두 수가 같아야 한다. 순환 순열이므로 A를 두 배로 늘린 문자열에서 B의 개수를 찾는다. 풀이 A와 B 두 문자열을 입력 받을 때, A는 두 번 반복하도록 한 후 함수 find를 호출하여 그 반환값을 출력한다. 함수 find에서는 B의 길이를 N에 저장하고 B의 부분 일치 테이블 lps를 구한다. 두 배로 늘린 A에서 인덱스 1부터 시작하여 B를 찾고, 그 개수를 res에 저장하여 반환한다. 현재 A는 원래 입력 받은 A를 두 번 반복하도록 했으므로 처음과 끝의 중복 계산을 막기 위해 인덱스 1부터 시작한다. def find(): N = len(B) lps = [0]*N j = 0 for i in range(1, N): while j > 0 and B[i..
아이디어 리스트를 정렬해 성적이 낮은 학생 7명을 뽑는다. 풀이 성적을 저장할 리스트 scores에 초기값으로 100을 할당한다. 입력 받는 성적이 현재 scores에서 가장 높은 성적보다 작으면 더 작은 성적으로 대체하고 scores를 오름차순 정렬한다. 마지막에 하위 7명의 성적을 소수점 아래 세 자리까지 출력한다. import sys input = sys.stdin.readline N = int(input()) scores = [100]*7 for i in range(N): score = float(input()) if score < scores[6]: scores[6] = score scores.sort() for i in range(7): print(f'{scores[i]:.3f}') 힙을 사용..
아이디어 문자열의 접두사와 접미사가 일치하는 최대 길이를 구한다. 풀이 #1 KMP 알고리즘을 이용하여 부분 일치 테이블 lps를 구한 후, 맨 마지막 문자의 부분 일치 값을 전체 길이 N에서 뺀다. def last_lps(): S = input() lps = [0]*L j = 0 for i in range(1, L): while j > 0 and S[i] != S[j]: j = lps[j-1] if S[i] == S[j]: j += 1 lps[i] = j return lps[-1] L = int(input()) print(L-last_lps()) 테이블 생성 코드를 함수로 따로 빼지 않은 코드는 메모리 사용량은 비슷했으나 더 느렸다. # 더 느린 코드 L = int(input()) S = input()..
아이디어 정규 표현식에 따라 문자열을 처리해준다. 풀이 #1 (Python) re 모듈의 sub 함수를 이용하여 입력 받은 문자열을 조건에 맞게 파싱하고, 그 결과를 출력한다. import re li = [(r'', ''), (r'', '\n'), (r']*>', ''), (r'', ''), (r'', ''), (r' *', ''), (r' *', '\n'), (r' {2,}', ' '), (r'\n+$', '')] HTML = input() for p, s in li: HTML = re.sub(p, s, HTML) print(HTML) 풀이 #2 (JavaScript) 풀이 #1 코드와 마찬가지로 자바스크립트의 정규 표현식에 맞게 코드를 작성한다. const fs = require('fs'); cons..