본문 바로가기

분류 전체보기

(249)
빽 투더 기본기 [알고&자구 1편]. 정렬 기본 정렬에 대해서 정리해 놓는다. 그냥 나 알아보기 쉽게, 직관적으로만 설명한다. 시간 복잡도 O(n^2) 정렬 선택 정렬 뒤에 가장 큰, 또는 가장 작은 값을 현재 인덱스 뒤부터 찾아, 앞의 인덱스부터 하나씩 채워나가는 정렬. # selection sort a = [3,1,2,5,4,6,7] size = len(a) for i in range(size): for j in range(i+1, size): if a[j] < a[i]: a[i], a[j] = a[j], a[i] print(a) 버블 정렬 뒤에 가장 큰, 또는 가장 작은 값을 뒤로 밀어밀어 보내, 마지막 인덱스부터 하나씩 채워나가는 정렬 # bubble sort a = [3,1,2,5,4,6,7] size = len(a) for i in r..
파이썬 정렬, 다중 조건으로 한 번에 하기. 파이썬으로 문제를 풀다보면, 여러 조건으로 소팅을 해야하는 경우가 있다. 일반적인 소팅은 다음과 같이 sorted() 혹은 .sort() 를 사용한다. a = [4,1,2,5,7,3,6] b = sorted(a) # b = [1,2,3,4,5,6,7] sorted() 를 찬찬히 살펴보면 다음과 같다. a = [(1, 2), (0, 1), (5, 1), (5, 2), (3, 0)] # 인자없이 그냥 sorted()만 쓰면, 리스트 아이템의 각 요소 순서대로 정렬을 한다. b = sorted(a) # b = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)] # key 인자에 함수를 넘겨주면 해당 함수의 반환값을 비교하여 순서대로 정렬한다. c = sorted(a, key = lambd..
[BOJ] 17135. 캐슬 디펜스 문제 캐슬 디펜스 (https://www.acmicpc.net/problem/17135) 풀이 1. 초기접근 문제조건 해석 판이 주어지고, 각 턴에 따라 판의 형태가 달라진다. 문제에서 이야기 했 듯, 궁수의 위치가 중요하다. 궁수의 위치에 따라, 진행되는 판의 모양이 달라진다. N, M BFS다. 가장 왼쪽에 있는 -> 방향 순서를 고려해줘야 한다. 같은 적이 여러 궁수에게 공격당할 수 있다는 말은, 각 궁수가 없애고자하는 좌표가 겹칠 수 있다는 말이다. 없앨 좌표를 일괄적을 처리해야 한다. 알고리즘 먼저, 각 궁수가 위치할 수 있는 모든 경우를 구한다음, 각 경우를 탐색한다. itertools.combination 을 이용하면 된다. 각 경우에서, 3명의 궁수가 이번 스텝에 없앨 적의 좌표(targe..
[BOJ] 14891. 톱니바퀴 문제 톱니바퀴 (https://www.acmicpc.net/problem/14891) 풀이 1. 초기 접근 문제조건 해석 각 스텝에 따라, 기존 자료구조의 값이 바뀌는데, 바뀌는게 연쇄적이다. 시뮬레이션 + DFS 문제다. 알고리즘 문제 조건에서, 많은걸 알려주는데, 일단 톱니바퀴를 리스트로 표현할 수 있음을 알 수 있다. 그리고 톱니바퀴의 회전은 리스트 요소들을 왼쪽 혹은 오른쪽으로 시프트하는 것임을 알 수 있다. deque 의 .rotate() 가 있다! 회전 조건은, 정해진 인덱스를 비교하면 된다. 코드 from collections import deque from sys import setrecursionlimit setrecursionlimit(10**8) def dfs(no, di, visit..
[BOJ] 12100. 2048 (Easy) 문제 2048 (Easy) (https://www.acmicpc.net/problem/2048) 풀이 1. 초기 접근 문제조건 해석 판이 주어지고, 각 스텝마다 판 전체의 값이 달라진다. 움직이는 방향은 4가지 이므로, 바뀌는 판도 4가지 경우가 생긴다. 특정 스텝에서 멈추고, 가장 큰 값을 반환해야 한다. BFS 문제다. 알고리즘 전체적인 BFS 문제, 바뀌는 것은 전체 판이니, BFS queue 에 전체 판을 넣어주면 된다. 한 번에 4가지 경우의 판이 생기고, 총 5번까지 해야하니, 최대 경우의 수는 4^5 = 1024개다. 각 방향에 대하여 움직이는게 좀 까다로운데, 이를 별도의 함수 move(board, di) 로 두자. 먼저 이전의 판 board 와 움직이는 방향 di 를 넘겨받아, 움직임이 ..
[BOJ] 14499. 주사위 굴리기 문제 주사위 굴리기 (https://www.acmicpc.net/problem/14499) 풀이 1. 초기 접근 문제조건 해석 역시 삼성 문제는 뭔가 글이 많다. 세세하게 잘 읽어야한다. 두번 세번 읽어줘야 한다. 문제를 잘 읽고 코딩하자. 삼성 문제의 대표적인 시뮬레이션 문제다. 문제에서 주어진 대로 그냥 짜기만 하면 된다. 핵심은, 과연 올바른 자료구조로 잘 구현할 수 있는가? 다. 알고리즘 주사위의 각 면을 어떻게 변화시키고 어떻게 각 면에 접근해야할까? 라는 생각이 가장 먼저든다. 먼저 제일 중요해보이는 건, 윗 면과 아랫 면이다. 우리는 이 면에 지속적으로 접근하게 된다. 윗 면과 아랫 면을 고정 인덱스로 두고 접근해야, 덜 복잡할 듯하다. 주사위의 각 면을 고정 인덱스로 두자는 발상이 나오게 ..
[BOJ] 14501. 퇴사 문제 퇴사 (https://www.acmicpc.net/problem/14501) 풀이 1. 초기 접근 문제조건 해석 이 문제, 뭔가 어렵지 않아보이긴 하다. 목표 상태(n 번째 일)가 있고, 상태에 도달하는 경로들을 탐색해나가야 한다. 각 경로에 따라, 최종 상태의 값이 달라진다. n도 매우 작다. DFS 로 풀 수 있다. 한편, 점화식을 잘 세우면 DP로도 풀 수 있을 듯 하다. 알고리즘 DFS로 풀면, 다음과 같다. 오늘이 i 일이라고 하자. 경우는 2가지다. 오늘 일할 경우와 일 안할 경우다. 일 하면 i + t[i] 일에 또 위 선택을 해야한다. 일 안하면 그냥 다음 날 i+1 일에 위 선택을 하면 다시 하면 된다. 많아봐야 15일 까지니, 시간 복잡도는 O(2^15) 이다. 코드 def dfs..
[BOJ] 16234. 인구 이동 문제 인구 이동 (https://www.acmicpc.net/problem/16234) 풀이 1. 초기 접근 문제조건 해석 역시 삼성 문제는 뭔가 글이 또 많다. 세세하게 잘 읽어야한다. 두번 세번 읽어줘야 한다. 문제를 잘 읽고 코딩하자. 삼성 문제의 대표적인 DFS, BFS 문제다. 인접한 칸으로 탐색해야 하고, 특정 조건 (인접한 칸의 값이 L 이상 R 이하) 인 경우, 더 파고들어 계속 탐색해야 한다. 여기서는 BFS 로 풀어보겠다. 알고리즘 먼저, 현재 상태에서 문제에서 말하는 연합(union) 인 좌표들을 먼저 다 찾아내야 한다. 이 과정에서 BFS를 쓴다. 연합인 좌표들은 자연스레 visited 에 들어가게 된다. BFS로 탐색하며, 연합인 좌표들의 값을 모두 더하고(total), 그 갯수(..