목록[IT] (125)
할껀하고놀자
# 6.4 소풍 문제를 해결하는 (잘못된) 재귀 호출 코드 from sys import stdin import sys sys.stdin = open('1.txt') # 3 # 2 1 # 0 1 # 4 6 # 0 1 1 2 2 3 3 0 0 2 1 3 # 6 10 # 0 1 0 2 1 2 1 3 1 4 2 3 2 4 3 4 3 5 4 5 def countPairings(taken, areFriend, n): finished = True for i in range(n): if not taken[i]: finished = False if finished: return 1 ret = 0 for i in range(n): for j in range(n): if not taken[i] and not taken[j]..
# 6.3 보글 게임판에서 단어를 찾는 재귀 호출 알고리즘 dx = [-1, -1, -1, 1, 1, 1, 0, 0] dy = [-1, 0, 1, -1, 0, 1, -1, 1] # 한글자만 검사하는 방식으로 기저사례를 찾아내었다. def hasWord(y, x, word, a): # 기저사례1 : 범위 넘어가지 않기 if (x = len(a) or y = len(a)):return False # 기저사례2 : 첫글자가 다를 경우 if (a[y][x] != word[0]): return False # 위 거름망 통과 후에 길이가 1이라면 첫글자도 같고, 범위도 넘어가지 않는 경우이므로 # 참 반환 if (len(word) == 1): return True for dir ..
# 6.2 n개의 원소 중 m개를 고르는 모든 조합을 찾는 알고리즘 def pick(n, list, toPick): if toPick == 0: print(list) return smallest = 0 if len(list) == 0 else list[-1] + 1 for next in range(smallest, n): list.append(next) pick(n, list, toPick - 1) list.pop() # 7까지의 숫자에서 4개의 숫자를 뽑고싶다. pick(7, [], 4)
# 삽입 정렬 list = [20,12,10,15,2] for i in range(len(list)): j = i while(j>0 and list[j-1]>list[j]): list[j-1],list[j] = list[j],list[j-1] j-=1 print(list) 속도 ( N~N^2) 정렬되어있다면 while문을 탐색하지 않기 때문에 for문 한번만 돌게 된다. 역순 정렬되어있다면 n^2번 탐색한다.
list = [20,12,10,15,2] for i in range(len(list)): for j in range(len(list)-1-i): if list[j]>list[j+1]: list[j],list[j+1] = list[j+1],list[j] print(list) 정렬 방법론. 1. N번째 위치와 N+1번째 위치의 값을 비교해서, N+1번째 위치의 값이 더 클 경우 N번째와 N+1번째의 값을 교환함. 특징. 1. 계속 비교하므로 리스트 크기가 크면 불리하다. 2. 정렬이 거의 된 데이터일 경우 더 유리하다.(교환이 적게 일어나므로) 3. 데이터가 역순인경우, 즉 최악의경우에 시간이 엄청 느리다.
list = [20,12,10,15,2] for i in range(len(list)): for j in range(i+1,len(list)): if list[i]>list[j]: list[i],list[j] = list[j],list[i] print(list) 정렬 방법론. 1. 최솟값을 찾아서 0번째 위치와 바꿈. 2. 0번째 위치를 제외한 최솟값을 찾아서 1번째 위치와 바꿈. 3. N번째까지의 위치를 제외한 최솟값을 찾아서 N번째와 바꿈. 4. 끝까지 가면 성공. 특징. 1. 정렬되있는 순서로 들어오던 아니던 실행시간이 비슷하다. 항상 비교하는양이 동일하기 때문. 2. 추가적인 기억장소를 요구하지 않는다.
상어 배열에 넣기 낚시왕 한칸씩 이동 임시 배열 하나 생성(새로운 상어가 놓일 위치 지정용) 가장 가까운 열에 있는 상어 잡기 상어 이동 for문 돌리면서 방향 이동해주기 import sys from sys import stdin # sys.stdin = open('input.txt') input = stdin.readline r, c, m = map(int, input().split()) a = [[[0, 0, 0] for _ in range(c)] for _ in range(r)] for _ in range(m): x, y, s, d, z = map(int, input().split()) a[x-1][y-1] = [s, d-1, z] dx, dy, ans = (-1, 1, 0, 0), (0, 0, 1..
궁수 3명 지정해준다 n번만큼 돌면서 3명의 아쳐들과 비교한다 거리를 비교 선택받은 적은 킬한다 한칸씩 밑으로 내린다 정답이 최대인 걸 구한다. 수도코드 짜는게 솔직히 제일 중요한걸 느끼는데 하루남았네? import sys,copy from heapq import heappush,heappop from sys import stdin # sys.stdin = open('input.txt') input = stdin.readline n,m,d = map(int,input().split()) a = [list(map(int,input().split())) for _ in range(n)] archer = [0]*3 def kill(b): cnt = 0 for _ in range(n): v =[] for idx..
import sys sys.stdin = open('input.txt') n,m = map(int,input().split()) a = [list(map(int,input().split())) for _ in range(n)] chi,home = [],[] select = [] def init(): global select for i in range(n): for j in range(n): if a[i][j]==1: home.append((i,j)) if a[i][j]==2: chi.append((i,j)) select = [False]*len(chi) # 집과 치킨집사이의 최소값을 구하고, 그 최소값을 모두 더한 최종 값이 가장 작은걸 구하면 된다. def solve2(tmp_chi): global a..
연구소 3 연구소에 바이러스를 퍼뜨리는데 걸리는 최소시간을 구하는 문제이다. 바이러스를 놓을 수 있는 모든 경우의 수를 만든 후, 각 케이스에 대해 bfs로 바이러스를 퍼뜨려서 최소값을 구하면 된다. 연구소의 사이즈는 n*n이고, 바이러스의 갯수는 m개이다. 바이러스를 놓을 수 있는 칸의 좌표들을 리스트화하여 리스트 v에 저장하자. 빈칸(0)의 갯수를 모두 세고, 이를 k라고 하자. 이 값은 바이러스를 퍼트려야하는 총 개수가 된다. 조합을 이용해 m개의 바이러스를 후보칸에 둔다. 이때 리스트 v를 활용하여, 바이러스를 놓은 칸의 좌표를 큐에 넣는다. bfs를 통해 바이러스를 퍼트린다. 감염시킬 때마다, 감염시킨 칸의 개수를 세고, 감염시간을 계속 업데이트 해준다. 감염은 (0)만 가능하지만, (2) 가 ..