전체 글 126

[그리디] 1826 연료 채우기, 1911 흙길 보수하기

7. 1826 연료 채우기 7.1. 유형파악 Greedy 그리디는 정렬과 같이 나올 확률이 높다. 바로 문제 유형이 보이지 않는다면 그리디를 의심해 볼 것 DP, Graph 알고리즘과 함께 나오는 경우도 있다. 그리디 문제는 항상 최적의 해를 구할 수 있는지 의심해봐야 한다. 7.2. 해결과정 현재 연료로 도달할 수 있는 주유소를 추린다. 추린 장소 중 가장 멀리 떨어진 주유소로 방문해본다. 해당 주유소에서 주유 후 다시 1-2번을 거친다. 만약 방문할 수 있는 장소가 없다면 -1을 출력한다. 7.3. 소스코드 import heapq n = int(input()) heap = [] for _ in range(n): heapq.heappush(heap, list(map(int, input().split()..

알고리즘 2021.09.15

[그리디] 17609 회문, 1715 카드 정렬하기

5. 17609 회문 5.1. 유형파악 Greedy 그리디 유형은 정렬과 세트로 출제된다 바로 문제 유형을 파악하기 어렵다면 그리디를 의심해볼 것 그래도 파악이 어렵다면 DP, Graph 알고리즘을 고려할 것 📌 그리디로 해법을 찾을 때는 항상 정당한 해법인지 의심해봐야 한다. 5.2. 해결과정 문자를 최대 하나 삭제할 수 있으므로 그리디 유형임을 파악. 단, 모든 문자열을 검토할 경우 시간초과 발생. 따라서 유사 회문은 투 포인터 방식으로 구현. 투 포인터로 양 끝에서 같은지 탐색 후, 다를 경우 check_pseudo() 호출. check_pseudo는 왼쪽 삭제, 오른쪽 삭제 2번 호출 왼쪽, 오른쪽 호출된 값 중 하나라도 True라면 1. 아니라면 2 반환 5.3. 소스코드 # val == val..

알고리즘 2021.09.13

[그리디] 1946 신입사원, 1339 단어 수학

3. 1946 신입사원 3.1. 문제유형 그리디, 정렬 3.2. 해결과정 그리디 문제지만 지원자가 10만명이므로 2중 for문으로 접근 시 10^10 연산 횟수가 필요하다. 따라서 O(n^2)이하의 복잡도로 문제를 해결해야 한다. 힌트는 서류나 면접점수 둘 중 하나로 정렬하면, 1명은 무조건 합격이라는 것을 알 수 있다. 이를 활용하여 서류로 정렬 후 합격자보다 면접점수가 높은 지원자를 카운트한다. 이전 합격자보다 면접점수가 높은 지원자가 나오면 면접 점수를 갱신한다. 3.3. 소스코드 import sys input = sys.stdin.readline t = int(input()) for _ in range(t): n = int(input()) apply = [list(map(int,input().sp..

알고리즘 2021.09.10

[시뮬레이션] 1244 스위치 켜고 끄기

10. 1244 스위치 켜고 끄기 10.1. 문제유형 시뮬레이션 10.2. 해결과정 여성일 경우와 남성일 경우를 처리하는 함수를 2개 구성했다. 남성의 경우 받은 번호의 배수에 해당하는 스위치를 Turnoff한다. 배수임을 확인할 때는 입력받은 값을 그대로 사용하되, 인덱싱할 때는 -1 처리한다. 여성의 경우 받은 번호의 양 옆 대칭인 스위치를 Turnoff한다. 입력받은 값을 -1 처리 후 왼쪽, 오른쪽 값을 인덱싱한다. 10.3. 소스코드 n=int(input()) switch=list(map(int,input().split())) s=int(input()) students=[list(map(int, input().split())) for _ in range(s)] def male(num): for ..

알고리즘 2021.09.08

[시뮬레이션] 16236 아기상어

9. 16236 아기상어 9.1. 문제유형 시뮬레이션 9.2. 해결과정 고려할 조건이 많은 까다로운 문제였다. 상어 위치를 찾고, BFS 탐색을 수행한다. 먹을 물고기가 있는지 없는지를 확인한다. 같은 거리라면 가장 위 물고기를, 그런 물고기가 여러마리라면 왼쪽 물고기를 먼저 먹는다. 상어의 크기 변화 조건 (먹은 물고기 수)을 체크한다. 먹이를 먹은 후, 새로운 위치 탐색을 위해 큐와 방문장소를 초기화한다. 먹이를 먹은 후, 현재까지의 시간을 저장한다. 9.3. 소스코드 from collections import deque dxs=[-1,1,0,0] dys=[0,0,-1,1] def BFS(x, y): Q, visited=deque([(x,y)]), set([(x,y)]) time=0 shark=2 e..

알고리즘 2021.09.08

[시뮬레이션] - 14503 로봇 청소기

7. 14503 로봇 청소기 7.1. 문제유형 시뮬레이션 7.2. 풀이과정 3가지를 정확히 구현해야 해결할 수 있었다. 좌표 이동을 기존 좌표계와 반대로 구현해야한다. 좌표 이동 시 방향 d가 현재 기준 왼쪽부터 탐색하도록 구현해야 한다. 방향 d에 대해 후진 위치를 정확히 지정해주어야 한다. 1,2번까지는 제대로 구현했으나, 3번 제대로 지정하지 못해 오랜 시간이 소요되었다. 7.3. 소스코드 n, m = map(int, input().split()) r,c,d = map(int, input().split()) graph = [list(map(int, input().split())) for _ in range(n)] visited = [[0]*m for _ in range(n)] dx=[-1,0,1,0..

알고리즘 2021.09.07

프로그래머스 [해시] - 베스트앨범

프로그래머스 해시 - 베스트앨범 1. 문제유형 hashmap 2. 해결과정 1.⭐가장 많이 재생된 장르 순서를 구한다. 2. 장르별 인덱스, 재생횟수를 저장한 딕셔너리를 구한다. 3.⭐2번에서 구한 딕셔너리를 재생횟수를 기준으로 정렬한다. 4. 1번에서 구한 장르별 순서대로 3번에서 구한 인덱스를 2개씩 꺼낸다. 3. 소스코드 from collections import defaultdict def solution(genres, plays): answer = [] gdict = defaultdict(int) pdict = defaultdict(list) for genre,play in zip(genres, plays): gdict[genre]+=play gdict = sorted(gdict.items(),..

알고리즘 2021.09.07

시뮬레이션 - 13335 트럭 / 14499 주사위굴리기

5. 13335 트럭 5.1. 문제유형 시뮬레이션 5.2. 풀이과정 주어진 로직을 따라가며 그대로 구현하였다. 두 가지 조건을 체크하며, 트럭을 통과시켰다. 다리가 꽉 차 있는가? 다리의 무게가 버틸 수 있는가? 다리가 꽉 차 있지 않고, 트럭 무게를 감당할 수 있으면 트럭을 통과시킨다. 다리 위의 트럭 초를 증가시키며 1칸씩 전진시킨다. ⭐ 주의할 점은 다리를 완전히 통과할 때, 동시에 다음 트럭이 들어와야 하는 경우를 고려해야한다. 따라서 미리 트럭을 제거해주었으므로, 마지막 소스코드에 1초를 추가해주었다. 5.3. 소스코드 from collections import deque n, w, l = map(int, input().split()) trucks = deque(list(map(int, inpu..

알고리즘 2021.09.06

프로그래머스 [해시] - 위장

프로그래머스 해시 - 위장 1. 문제유형 hashmap 2. 해결과정 경우의 수 문제이므로 각 type별 의상 개수를 구한다. 각 type별 의상 개수 + 1을 곱한 값에서 -1 처리를 구한다. 의상 개수 + 1을 하는 이유는 해당 의상을 안 입는 경우가 있기 때문이다. 결과값에서 -1 처리를 하는 이유는 어떤 의상도 입지 않은 경우를 제거하기 위함이다. 3. 소스코드 from collections import defaultdict def solution(clothes): answer = 1 hashmap = defaultdict(list) for name, type in clothes: hashmap[type].append(name) for k, v in hashmap.items(): answer *=..

알고리즘 2021.09.06