알고리즘 64

[시뮬레이션] 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

프로그래머스 [해시] - 전화번호 목록

프로그래머스 해시 - 전화번호 목록 1. 문제유형 hash map 2. 해결과정 크게 3가지 풀이방법이 존재했다. 2중 for문을 활용하는 방법 문자열 내장함수 startswith를 사용한 방법 hash를 활용한 방법 결론적으로 1번 방법은 시간복잡도가 O(N^2)이므로 효율성 문제를 통과할 수 없다. 따라서 2번과 3번을 활용한 풀이가 가능하다. 3. 소스코드 def solution1(phone_book): answer = True phone_book = sorted(phone_book, key=len) for n1 in phone_book: for n2 in phone_book: if n1 == n2[:len(n1)] and n1 != n2: answer = False return answer ret..

알고리즘 2021.09.05

2606 바이러스, 14502 연구소 - DFS/BFS

1. 2606 바이러스 1.1. 문제유형 그래프, BFS, DFS 1.2. 자료구조 Q (deque): BFS 구현을 위한 큐 자료구조 node (int): Q에서 꺼낸 현재 노드(Vertex) next (int): node와 연결되어 있으며 다음에 방문할 노드(Vertex) graph (2d-list): 인접 리스트(Adjacency list)로 노드에 연결된 간선(edge) 정보 저장 visited (1d-list): 방문 여부를 확인하는 리스트 1.3. 해결과정 ⭐1번 노드부터 BFS를 순회하며 방문한 장소는 True로 표시한다. 방문이 끝난 후 True의 개수를 출력한다. 이 때, 1번은 포함하지 않으므로 -1한 값을 출력한다. 1.4. 소스코드 from collections import dequ..

알고리즘 2021.08.25

백준 - 11977 Angry Cows [이분탐색, 브루트포스]

11977 Angry Cows 1. 문제유형 이분탐색, 정렬, 브루트포스 2. 자료구조 n (int): 건초의 수 bay (list): 건초의 위치를 담은 리스트 cur (int): 현재 건초의 위치 인덱스 rad (int): 폭발 사정거리 l (int): 옮겨 붙을 왼쪽 건초 좌표 인덱스 r (int): 옮겨 붙을 오른쪽 건초 좌표 인덱스 cnt (int): 폭발시켜 태운 건초의 최대값 3. 해결과정 ⭐왼쪽으로 옮겨 붙는 경우와 오른쪽으로 옮겨 붙은 경우를 나누어 구했다. ⭐왼쪽으로 옮겨 붙을 때는 터뜨린 가장 왼쪽 건초 index까지 count한 후 rad를 증가시킨다. ⭐오른쪽으로 옮겨 붙을 때 역시, 터뜨린 가장 오른쪽 건초 index까지 count한 후 rad를 증가시킨다. 0번째 건초부터 n-..

알고리즘 2021.08.17

백준 - 1477 휴게소 세우기 [이분탐색]

1477 휴게소 세우기 1. 문제유형 이분탐색 2. 자료구조 distance (int): 도로 최대 길이 conv (list): 휴게소 위치를 담은 리스트 left, right (int): 휴게소가 없는 최대거리의 최소값(1), 최대값(distance-1) mid (int): 지정한 최대거리의 최소값. left, right의 중간값 current (int): 현재 위치를 저장할 변수 diff (int): 현재 위치 - 다음 휴게소 위치로 휴게소가 없는 거리 cnt (int): 설치한 휴게소 개수 3. 해결과정 ⭐ 놓친점) diff가 mid와 같은 경우 휴게소를 설치하지 않아야 한다. (따라서 diff-1을 mid로 나눈다.) ⭐ 아이디어) 휴게소가 없는 최대거리의 최소값을 지정하고, 휴게소를 설치를 완료..

알고리즘 2021.08.15