dfs 3

[알고리즘] 중복조합

중복조합 서로다른 n개의 원소 중, 중복을 허락하여 r개를 뽑는 것. nHr = (n+r-1)C(r) 조합에서의 중복만 허용하므로 순서는 여전히 상관하지 않는다.(조합) dfs에서 i+1이 넘어가면 조합, i가 넘어가면 중복조합 def dfs(idx, depth): if depth == r: print(*comb) for i in range(idx,n): comb[depth] = arr[i] dfs(i, depth + 1) n-1개의 칸막이를 뽑아야하는 요소들 r개 사이에 배치하는 경우의 수. = n-1개의 막대기로 구분된 영역에 요소를 집어넣는 경의의 수. nHr = n-1+r C n-1 = n-1+r C r 다음에 예제 풀어 첨부할 것.

[백준][Python] 14888 연산자 끼워넣기

경우의 수를 만들어 연산자를 대입하는 문제였다. 보자마자 DFS가 생각나서 설계했는데 처음에는 +-보다 */연산을 먼저 처리하는 줄 알고 문자열로 calculate를 쌓고 eval answer에 삽입햇으나 테케 통과 못하고 문제 다시일어보니 앞에서부터 순차 연산... str에서 int로 바꾸고 진입시마다 계산해주면서 들어갔다. import sys input = sys.stdin.readline def DFS(idx,calculate): if idx==N: answer.append(calculate) return num = seqs[idx] for operator in '+-*/': if operator == '+'and opers[0]: opers[0] -=1 DFS(idx+1,calculate+num)..

[백준][Python] 16929 two_dots

싸이클을 만들 수 있느냐는 문제 조건은 1. 이전칸으로 가지 않을 것 2. 이전칸을 제외하고 방문했던 지점을 만나면 싸이클이 존재. N,M=map(int,input().split()) matrix=[list(map(str,input()))for _ in range(N)] visited = [[False]*M for _ in range(N)] dy=[0,0,1,-1] dx=[1,-1,0,0] # 싸이클의 조건 # 1. 바로 이전 칸으로 가지 말 것( 이전 좌표 가억해두고 같으면 이동하지말것.) # 2. 그럼에도 불구하고 갔던 곳(visited true)를 만나면 싸이클이 존재하므로 True를 반환할것. def dfs(x,y,px,py,ball): if visited[x][y]==True: return Tr..