본문 바로가기

개발자 강화/코딩 테스트

(58)
[백준] 22233 가희와 키워드 / 구현 / Python 실3 "시간초과의 늪"https://www.acmicpc.net/problem/22233예전 포스팅에서도 쓴 적이 있는데파이썬에서 시간초과가 뜨면 input 대신 sys.stdin.readline을 쓰라는 교훈을 얻었던 적이 있다. 문제는 정말 간단하다 메모장에 적은 키워드를 set으로 입력받고,블로그에 글을 m개 적을 때마다콤마를 구분으로 입력을 분리해서 임시 set을 만든 후메모장 set에서 현재 글에 입력한 단어 임시 set을 빼준다그리고 현재 메모장의 길이를 출력한다 python의 set을 잘 쓰면 된다그런데 입력 받는 부분이 잘 구현되어야 하는 것 같다그것 때문에 시간초과가 너무 많이 발생해서, 결국 다른 블로그를 봤는데코드 구조는 똑같은데 입력 부분만 달랐다 import sysinput = sys...
[백준] 17266 어두운 굴다리 / 이진탐색 / Python 실4 오랜만입니다. 아직 학부생이라 기말고사 공부하다 늦었음 https://www.acmicpc.net/problem/17266 가로등 높이만큼 왼쪽 오른쪽으로 빛이 퍼지는 데, 0~n 구간을 빠짐없이 빛으로 덮을 수 있는 최소 가로등 높이를 구해야 함 while문으로 이진탐색을 해야 풀리는 문제더라구요 left, right를 두고 역전되는 시점에 while문을 종료합니다 높이 h를 left right의 중간값으로 잡고,현재 높이에서 커버 가능한 구간의 끝점을 잡아서 비교합니다 가로등 위치 for문을 돌면서현재 커버 가능한 구간의 끝점을 가로등 위치+가로등 높이 h로 업데이트합니다만약 커버 가능한 구간의 끝점이 가로등 위치 - 가로등 높이 h보다 작은 경우,이전 가로등 커버 범위와 현재 가로등 커버 범위 사이..
[백준] 1522 문자열 교환 / 구현 / python 실1 슬라이딩 윈도우 풍년이네https://www.acmicpc.net/problem/1522a랑 b 섞인 문자열이있고 문자 위치를 교환해서 a가 쭉 연속된 문자열로 만들기 위해필요한 최소 교환 횟수를 구해야 한다 문자열이 원형이라 처음과 끝이 이어져있다는게 관건 원형 처리를 원활하게 하기 위해 문자열을 두번 이어붙인다 처음 size만큼의 문자에서 b의 개수를 세어 초기 윈도우 값으로 사용한다 1부터 문자열 길이번째 원소까지 탐색한다슬라이딩하면서 윈도우의 왼쪽 문자를 제거하고, 오른쪽 문자를 추가하면서한 칸씩 이동한다이때 왼쪽 문자가 b였으면 b개수-1, 오른쪽 문자가 b였으면 b개수+1한다 이전 최소 값과 현재 값을 min으로 비교해서 업데이트한다 계속 윈도우를 이동시키면서 b의 개수가 최소로 포함되는 구간..
[백준] 1283 단축키지정 / 구현 / Python 실1 https://www.acmicpc.net/problem/1283 뭔가 오랜만에 보는 코테같은 문제...진짜 구현 같은 문제? 각 줄마다 입력되는 단어를 공백으로 구분해서 배열로 추가한다그럼 이차원 배열 형태가 된다 이차원 배열을 탐색하면서i번째 원소를 k라고 둔다k 안에도 여러 개의 단어가 들어있으니 다시 for문을 돌린다 k 안에 있는 j번째 단어는 key라고 지정한다 일단 각 단어의 첫 글자가 단축키로 지정이 되어야 하기 때문에가장 먼저 key의 0번째 요소를 본다(* 모든 요소를 비교할 때는 lower case로 바꿔서 비교해야 대소문자 구분없음 조건을 잘 충족할 수 있다 0번째 요소가 아직 단축키에 없으면(save 배열에 없으면)save 배열에 key[0]요소를 추가한다그리고 해당 단어를 출력 ..
[백준] 24037 문자열게임2 / 구현 / python 골5 보자마자 슬라이딩 윈도우라는 생각 https://www.acmicpc.net/submit/20437 처음에는 '20922_겹치는 건 싫어'의 풀이를 응용해보려고 했다이 풀이는 어떤 문자를 k개 이하로 포함하는 가장 긴 부분 수열을 구하는 문제 그래서 이걸 응용해서 어떤 문자를 정확히 k개 포함하는 가장 짧은 부분 수열을 구하는 것까지는 괜찮았다근데 어떤 문자를 k개 포함하면서, 처음과 끝이 그 문자로 이뤄진 수열을 구하는 부분에서 좀 오차가 있었다 from collections import defaultdictt = int(input())for i in range(t): a = list(map(str, input().strip())) k = int(input()) n = len(a) ..
[백준] 11501 주식 / 그리디 / python 실2 https://www.acmicpc.net/problem/11501 역순으로 풀면 풀리는 문제 처음에는 정순으로 푸려고 했다 오늘 가격보다 내일 가격 작으면현재 구매했던 티켓을 다 팔아버리기 오늘 가격보다 내일 가격이 크거나 같으면한장 사기 근데 생각해보니내일 작다고 당장 팔아버리는 것보다그 다음에 더 큰 값이 나왔을 때 존버하고 파는 게 나은건가?그런 생각이 들긴 했다 처음에 구현했던t = int(input())for i in range(t): n = int(input()) a = list(map(int,input().split())) #3 #10 7 6 #감소수열은 아무것도 안사고, 안파는게 맞음 #3 #3 5 9 #증가 수열은 하루에 하나씩 사고, 마지막날..
[백준] 2668 숫자고르기 / dfs / python 골5 첫째 줄 숫자를 노드로둘째 줄 숫자를 노드와 연결된 숫자로 생각하면그래프 간선이라고 생각할 수 있다 입력받을 때 방향성 그래프 형태로 구성한다 뽑힌 숫자들이 이루는 집합, 숫자들이 가리키는 숫자들이 이루는 집합이 두 개가 동일하려면 집합 내 숫자들은 사이클을 형성해야 한다최대 사이클을 찾는 문제로 해석할 수 있다 그래프를 돌면서 현재 원소를 방문한 적이 없으면 dfs함수를 돌린다해당 원소가 시작점이 되기 때문에, 해당 원소와 빈 배열을 dfs 함수로 넘겨준다 dfs 함수만약 현재 node가 이미 방문된 경우현재까지 누적된 경로에 node값이 존재한다면 사이클임path에서 사이클에 해당하는 부분을 잘라 result 집합에 추가한다 현재 node를 방문 처리한다현재 node를 path에 추가한다현재 node..
[백준] 2304 창고 다각형 / Python 실2 https://www.acmicpc.net/problem/2304 가장 높은 기둥을 기준으로 좌 우로 나눔 왼쪽0부터 시작해서 가장 높은 기둥의 index까지우선 height는 가장 첫 번째 기둥 높이로 초기화한다 결과값에 height*(다음 기둥 위치-현재 기둥 위치)를 더해서 면적을 업데이트한다만약 현재 기둥보다 다음 기둥이 높은 경우에는 height값을 다음 기둥 높이로 업데이트한다 오른쪽은이 과정을 끝에서부터 가장 높은 기둥의 index까지 역순으로 진행한다height는 가장 마지막 기둥 높이로 초기화 한다결과값에 height*(현재 기둥 위치-이전 기둥 위치)를 더한다마찬가지로 현재까지 탐색한 기둥 중 가장 높은 기둥을 height에 업데이트 해야 한다 굿! https://velog.io/@ho..
[백준] 20922 겹치는 건 싫어 / 구현 / Python 실1 https://www.acmicpc.net/problem/20922 보자마자 필이 짜르르 옴이건 슬라이딩 윈도우다 윈도우 범위 조절을 위해 start, end 두개 사용범위 내 숫자 빈도는 딕셔너리 사용 현재 윈도우 범위에서 특정 숫자가 K개를 초과하면start를 움직여서 k개가 되도록 while문을 돌면서 이동 윈도우 최장 길이는end-start+1로 업데이트 from collections import defaultdictn,k = map(int,input().split())a = list(map(int,input().split()))count = defaultdict(int)start=0max_l = 0for end in range(n): count[a[end]]+=1 while count..
[백준] 21921 블로그 / 구현 / Python 실3 https://www.acmicpc.net/problem/21921 슬라이딩 윈도우로 푸는 문제! 처음에는 for문 돌면서 배열에 s = a[i:i+k] 값을 저장하고, max 값을 업데이트 하는 방식으로 구현했는ㄴ데이렇게 하면 O(n*x)가 되어 시간초과가 났다 그래서 슬라이딩 윈도우를 사용하면서 전역변수에서 현재 a[i]값을 더하고 이전 a[i-x] 원소 값을 빼서현재 sum이 x개의 원소 합으로 유지되도록 구현한다이렇게 하면 slicing으로 탐색해서 끊지 않아도 된다 만약 현재 sum이 이전 max값보다 크다면count값을 1로 리셋하고max값을 현재 sum으로 대체한다 만약 현재 sum과 max값이 같다면 count을 1 증가한다 max값이 0보다 크면 max값과 count값을 출력하고그 외에는..