알고리즘 문제풀이(Python) 9

마라톤 - 해시

문제 hsin.hr/coci/archive/2014_2015/contest2_tasks.pdf 입력 1. 마라톤에 참여한 선수의 이름 배열 2. 마라톤을 완주한 선수의 이름 배열 출력 마라톤에 참여했지만 완주하지 못한 선수의 이름 입출력 예 입력 : ["leo", "kiki", "eden"], ["eden", "kiki"] 출력 : "leo" 입력 : ["marina", "josipa", "nikola", "vinko", "filipa"], ["josipa", "filipa", "marina", "nikola"] 출력 : "vinko" 입력 : ["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"] 출력 : "mislav" #marathon..

10814번, 10989번

1. 10814 # 10814.py def main2(): n = int(input()) data = [] for x in range(0, n): s = input().split(' ') data.append((int(s[0]), s[1])) dataSorted = sorted(data, key = lambda x : x[0]) for d in dataSorted: print ("{0} {1}".format(d[0], d[1])) main2() Python 내장 정렬함수 sorted에 두 번째 인자 key로 lambda 함수를 넣어준다. 파라미터의 첫 번째 요소를 기준으로 정렬한다. sorted는 비교값이 같을 경우 리스트의 기존 순서를 보장한다. 2. 10989 메모리와 시간제한을 고려해야 하는 문제다..

최소값 최대값 찾기

문제 공백으로 구분된 숫자들의 문자열 str이 주어진다. str에 들어있는 숫자 중 최소값과 최대값을 찾아 이를 "최소값 최대값"형태의 문자열을 반환하는 함수, solution을 완성하라 예 str : "1 2 3 4" return : "1 4" # solution.py def main(s): spl = [int(x) for x in s.split(" ")] result = "{0} {1}".format(min(x for x in spl), max(x for x in spl)) print (result) if __name__ == "__main__": l = ["1 2 3 4", "-1 -2 -3 -4", "-1 -1"] for s in l: main(s)

1003번: 피보나치 함수 - 동적계획법

https://www.acmicpc.net/problem/1003 1003번: 피보나치 함수 각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다. www.acmicpc.net 2020/07/11 - [Unity & C#] - 2748번: 피보나치 수 2 - 동적계획법 2748번과 비슷한 피보나치 문제고, 동적계획법으로 분류되어 있다. 아래와 같은 기본적인 피보나치 함수로 피보나치 수를 구할 때, 호출되는 Fibonacci(0)과 Fibonacci(1)의 횟수를 구해야 한다. def Fibonacci(n): if n == 0: print ("0") return 0 elif n == 1: print ("1") return 1 else: return Fibonacci(n..

2748번: 피보나치 수 2 - 동적계획법

https://www.acmicpc.net/problem/2748 2748번: 피보나치 수 2 문제 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)�� www.acmicpc.net 동적계획법(Dynamic Programmin)이란 복잡한 문제를 작은 단위로 분할하여 풀고 최종적으로 그것을 결합해 해겨하는 방법을 말한다. 동적계획법의 핵심은 메모이제이션(Memoization)이다. 동일한 계산이 중복되는 문제에서 한 번 계산한 결과는 저장해 둔다. 그리고 다음 번 동일한 계산이 필요할 때 연산하지 않고, 저장해둔 이전 결과에 접근해 사..

10816번: 숫자 카드 2 - Hash Table

https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 이번엔 Hash Table을 이용해 간단히 풀어보자. Hash Table은 Key에 Value가 저장되는 자료형이다. Python에선 Dictionary가 해당된다. # NumberCard2.py - HashTable def HashTable(): cardsDic = {} for i in cards:# Dictionary에 Key를 카드 번호, Value를 카드 ..

10816번: 숫자 카드 2 - 이분 탐색(Lower Bound, Upper Bound)

https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 문제 분류는 일단 이분탐색으로 되어있지만 Hash Table 구조(Key, Value Pair)를 사용하여 해결할 수도 있다. 이분탐색(또는 이진탐색, Binary Search)은 오름차순으로 정렬되어 있는 리스트에서 특정한 값의 위치를 찾는 알고리즘이다. 정렬된 리스트에만 사용할 수 있지만, 매번 검색 범위가 반으로 줄기 때문에 O(logN)의 시간복잡도를 갖는..

1260번: DFS와 BFS

https://www.acmicpc.net/problem/1260 1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사 www.acmicpc.net 기본적인 DFS와 BFS를 구현하는 문제 재귀를 사용하지 않고 반복문으로만 풀어봤다. * 한 노드에 간선이 여러 개일 경우 값이 낮은 노드부터 오름차순으로 방문한다. 1) Input Parsing first = input().split(' ') N = int(first[0])# node의 갯수 M = int(first[1])# 간선의 갯수 V = int(fir..

4577번: 소코반

https://www.acmicpc.net/problem/4577 4577번: 소코반 문제 소코반은 1982년에 일본에서 만들어진 게임으로, 일본어로 창고지기라는 뜻이다. 이 게임은 캐릭터를 이용해 창고 안에 있는 박스를 모두 목표점으로 옮기는 게임이다. 목표점의 수와 박스� www.acmicpc.net 소코반 관련된 게 있나 찾아본 문제인데 막상 소코반과는 별 관련이 없다 . 단순 조건문으로 대충 풀이 본 소스. 문제의 예제 입력과 출력을 똑같이 보기 위해 입력을 처음에 다 받았다. count = 0; listR = [] # 행 갯수 listC = [] # 열 갯수 listTestMap = [] # 게임 맵 lisetSolution = [] # 유저 입력 while True: # Input _input..