Loading...

Trie 기본문제로 감잡아보기 -전화번호 목록, 게임 닉네임-

1. 문제1 5052번: 전화번호 목록 (acmicpc.net) 5052번: 전화번호 목록 첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 www.acmicpc.net 2. 풀이1 한 번호가 다른 번호의 접두어인 경우가 없어야한다 번호를 트라이에 순차적으로 저장하다가, 마지막을 나타내는 플래그 '*'을 만난다면, 지금 저장하려는 번호는 다른 번호의 접두어가 될 것이다 class Trie: def __init__(self): self.head = {} def add(self,word): current_node = self.head #문자열의 ..

그리디 알고리즘 한층 더 깊게 생각하는법 배우기 -선물할인-

1. 문제 25947번: 선물할인 (acmicpc.net) 25947번: 선물할인 입력은 표준입력을 사용한다. 첫 번째 줄에 선물의 개수를 나타내는 양의 정수 $n$ ($1 ≤ n ≤ 100\,000$), 예산을 나타내는 양의 정수 $b$ ($1 ≤ b ≤ 10^9$), 반값 할인을 받을 수 있는 최대 선물의 수를 www.acmicpc.net n개의 선물 가격이 있고, 예산이 b원일때, 반값 할인을 a번 받을 수 있다면, 최대로 살 수 있는 선물의 개수는..? 2. 풀이 가장 먼저 생각한건... 가격표를 정렬하고 큰 가격부터 a개는 반값으로 할인시킨다음에, 다시 정렬하고 b원만큼 사는 것 from sys import stdin n,b,a = map(int,stdin.readline().split()) p..

2022. 10. 30. 15:16

경이로운 그리디 알고리즘1 -만들 수 없는 합의 최솟값-

1. 문제 자연수로 이루어진 어떤 수열이 주어질때, 이 수열의 모든 부분수열의 합을 생각해보자 이때 불가능한 합의 최솟값을 구해본다면? 예를 들어 s = [5,1,2]이면, 1,2,3,5,6,7,8은 만들 수 있는데 4를 만들 수가 없다  2. 알고리즘 2-1) 수열을 오름차순으로 정렬한다 2-2) sum = 0로 초기화한다 2-3) 수열을 하나씩 순회해서 그것을 x라고 하자.  sum+1을 만들 수 있는지 확인해본다.  2-4) sum+1 >= x이면 sum+1까지 만들 수 있다. 그러면, sum + x를 sum으로 갱신한다. 2-5) sum+1  이것만 보면 아무리 생각해도 와닿지는 않는다 어떻게 보면 경이롭기까지하다.  진짜 이게 가능한건가? 여러가지 풀이를 보면서 이해해보도록 노력하자  3. 예시..

회의실 배정 문제 응용하기 -모든 수업을 가능하게 하는 회의실의 수는-

1. 문제 11000번: 강의실 배정 (acmicpc.net) 11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si = 현재 종료시간"이면 하나의 회의실에서 가능하다는 알고리즘으로 해결했다 근데 이 문제는 모든 수업을 가능하게 하는 최소의 회의실 수를 구해야한다 어떻게 하냐면 시작시간이 빠른 순서대로 오름차순 정렬한다 먼저 가..

2022. 10. 9. 22:42

필요한 위치에 삽입하면서 정렬하는 삽입정렬(insertion sort)

1. 개요 선택 정렬은 실제 사용하기에는 매우 느린편이다. 그렇다면 다른 접근 방법은 없을까? "데이터를 하나씩 확인하면서 각 데이터를 적절한 위치에 삽입하면 어떨까?" 삽입 정렬은 선택 정렬처럼 동작 원리를 직관적으로 이해하기 쉽지만, 구현 난이도가 더 어려운데, 하지만 선택 정렬에 비해 실행 시간 측면에서 효율적이라고 알려져있다 특히 삽입 정렬은 필요할 때만 위치를 바꾸므로 "데이터가 거의 정렬되어 있을때" 매우 효율적이다 선택 정렬은 현재 데이터의 상태와 상관없이 무조건 모든 원소를 비교하고 위치를 바꾸는 반면, 삽입 정렬은 그렇지 않다 삽입 정렬은 특정한 데이터를 적절한 위치에 삽입한다는 의미에서 삽입 정렬(insertion sort)이라고 부른다. 더불어 삽입 정렬은 특정한 데이터가 적절한 위치..

2022. 10. 9. 20:43

거품이 올라오는 것처럼 정렬하는 bubble sort(버블 정렬)

1. 개요 인접한 두개의 원소를 비교하면서 자리를 계속 교환하면서 정렬하는 알고리즘 첫번째 원소부터 인접한 원소끼리 계속 자리를 교환하면서 맨 마지막 자리까지 이동 한 단계가 끝나면, 가장 큰 원소가 마지막 자리로 이동함 교환하면서 자리를 이동하는 모습이 물 위에 올라오는 거품 모양과 같다고 하여 버블 정렬이라고 부름 2. 예시를 통해 이해하는 버블 정렬 55, 7, 78, 12, 42를 정렬한다고 생각해보자. 먼저 55와 7을 비교하여, 55가 더 크니까 자리를 바꾼다. 다음 55와 78을 비교하여, 78이 더 크니까 자리를 바꾸지 않는다. 다음 78과 12를 비교하여 78이 더 크니까 자리를 바꾼다 마지막으로 78과 42를 비교하여, 78이 더 크니까 자리를 바꾼다. 그러면 배열에서 가장 큰 원소인 ..