본문 바로가기

알고리즘 공부

(35)
[삼성SW역량테스트] 마법사상어와 토네이도 (백준 20057)| Python3 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import sysinput=sys.stdin.readline def get_move_order(n): orders=[] # (r,c,d) direction=[(0,-1),(1,0),(0,1),(-1,0)] r,c,d=n//2,n//2,0 for i in range(1,n): for _ in range(2): for j in range(i): mr,mc=r+direction[d%4][0], c+direction[d%4][1] orders.append((mr,mc,d%4)) r,c=mr,mc d+=1 for i in range(n-2,-1,-1): ..
[삼성SW역량테스트] 스타트 택시 (백준 19238)| Python3 모든 승객의 출발지는 다르지만, 목적지는 같을 수 있습니다 !! 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465import sysimport heapqfrom collections import dequeinput=sys.stdin.readline def get_shortest_path(map_of_passenger, arrive_flag=False, arrive_r=None, arrive_c=None): shortest_path=[]; count=number_of_passenger map_of_path=[[0]*n for _ in ran..
[삼성SW역량테스트] 청소년 상어 (백준 19236)| Python3 풀이) 문제에 쓰여진 대로 하되, 조건을 똑바로 읽자,,,! (상어는 빈 곳으로 움직일 수 없다든가...), 그리고 dfs 호출할 때 마다 deepcopy로 보내야한다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869import sysimport heapqfrom copy import deepcopyinput=sys.stdin.readline def fish_move(maps): direction=[(-1,0),(-1,-1),(0,-1),(1,-1),(1,0),(1,1),(0,1),(-1,1)] heap=make_heap(..
[삼성SW역량테스트] 마법사상어와 파이어스톰 (백준 20058)| Python3 과정) 문제 설명에 나와있는 대로 구현하면 됩니다. 주의해야할 것은 얼음의 양을 줄일 때, 줄임과 동시에 다음 칸을 탐색하는게 아니라, 모든 맵 탐색이 끝나면 줄일 칸의 값을 수정해야한다는 것입니다 !! (reduce_ice 함수 참고) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263import sysfrom collections import dequeinput=sys.stdin.readline def devide_rotate(L): p=2**L for i in range(0,(2**n)-1,p): for j in range(0,(2**n)-1..
[삼성SW역량테스트] 상어중학교 (백준 21609)| Python3 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182import sysfrom collections import dequeinput=sys.stdin.readline def get_biggest_group(): def bfs(row,col,color): block=[] cnt_of_rainbow=0 min_r, min_c=n-1,n-1 dx, dy = [-1,1,0,0], [0,0,-1,1] queue=deque([(row,col)]) visited[row][col]=True whi..
[삼성SW역량테스트] 마법사 상어와 비바라기 (백준 21610 )| Python3 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import sysinput=sys.stdin.readline def move_cloud(d, s): new=[] direction=[None, (0,-1),(-1,-1),(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1)] for x,y in clouds: mx,my=direction[d][0]*s, direction[d][1]*s new.append([(x+mx)%n, (y+my)%n]) return new def increase_water_in_cloud(clouds): for x,y in clouds: maps[x][y]+..
[BOJ] 0 만들기(7490) 문제 풀기 | Python3 문제 풀이) 백트래킹으로 문제를 풀었다. depth를 인덱스 삼아 1,2,...,N까지 수를 수식에 더하며 dfs함수를 호출했다. 결과는 ASCII 순서로 출력해야하므로 dfs 함수 재귀호출 시 sorted(['+', '-', ' ']) 로 정렬한 순으로 기호를 덧붙였다. 파이썬에는 eval() 이라는 강력한 함수가 존재하는데 공백 문자 그대로 입력하면 숫자가 붙여지지않고 에러를 내서 수식에 replace(' ', '') 한 결과를 eval 함수의 인자로 넘겼다. 문제 코드) 1234567891011121314def dfs(depth, exp): if depth==n: if eval(exp.replace(' ', ''))==0: print(exp) return for op in sorted(['+','-..
[Programmers 위클리 챌린지] 9주차 전력망을 둘로 나누기 풀이 | Python3 문제 풀이) BFS로 연결이 끊긴 노드 중 하나를 골라, 연결된 노드를 탐색하며 연결된 노드의 개수를 + 1 합니다. 노드의 수가 n으로 정해져있으므로 둘로 나뉜 전력망 중 한 개만 탐색하면 나머지 전력망의 노드개수는 n-탐색한 전력망의 노드 개수이므로 차를 구합니다. 모든 wire에 대해 차를 구하고 최소값을 리턴합니다. 코드) 12345678910111213141516171819from collections import deque solution=lambda n,wires: min(bfs(n,wires, wire) for wire in wires) def bfs(n, wires, wire): tree=[[] for _ in range(n+1)] for a,b in wires: if a==wire[0]..
[BOJ] 로또(6603) 문제 풀기 | Python3 문제 풀이) 집합 K에서 수 6개를 조합할 수 있는 경우를 모두 출력하는 문제입니다. 파이썬 내장 모듈 itertools.combinations 를 사용하면 훨씬 간단하지만 백트래킹 알고리즘을 사용해 문제를 풀어보고싶어 dfs함수를 사용하였습니다. 문제 코드) 1 2 3 4 5 6 7 8 9 10 11 12 def dfs(depth, sequence): if depth==6: print(*[numbers[i]for i in sequence[1:]], sep=' ') return for i in range(sequence[-1]+1, n): dfs(depth+1, sequence+[i]) while True: n, *numbers=map(int, input().split()) if n==0: break d..
[BOJ] N과M (1) (15649) 문제 풀기 | Python3 문제 풀이) 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열을 순서대로 출력하는 문제입니다. 저는 두 가지 방법을 사용하여 풀었습니다. 1) 파이썬 itertools permutations 모듈 이용해 순열 구하기 파이썬 내장패키지인 itertools를 이용하면 순열을 매우 간단하게 구할 수 있습니다. 메모리는 32388KB, 시간은 76ms 로 백트래킹 탐색보다 훨씬 빠르게 문제를 풀 수 있습니다. 1 2 3 4 5 from itertools import permutations n,m=map(int, input().split()) permutation=lambda n,m:print('\n'.join(list(map(' '.join,permutations(map(str, range(1,n+1))..