자료구조와 알고리즘/개인적인 코딩테스트 관련 풀이 60

[완전탐색][상태 트리] - 합이 같은 부분집합(DFS)

문제 주어진 n개의 요소를 가진 리스트에서 부분 집합이 나머지 부분 집합과 합이 같다면 합이 같은 부분집합이라고 한다. 이때 합이 같은 부분집합이 있다면 YES를 없다면 NO를 출력하세요 문제 풀이 def DFS(level,s): global flag if flag == 0: return if level == n: if s == (total_sum - s): print("YES") flag = 0 else: DFS(level + 1, s + a[level]) DFS(level+1, s) if __name__ =="__main__": n = int(input()) a =list(map(int,input().split())) total_sum = sum(a) flag = 1 DFS(0,0) if flag: ..

[완전탐색][상태 트리] - 부분집합 구하기(DFS)

문제 자연수 n이 주어지면 1부터 n까지의 원소를 갖는 집합의 부분집합을 모두 출력해라 문제풀이 -> 1 2 3 출력 -> 1 2 출력 def DFS(v): if v == n+1: for i in range(1, n+1): if checked[i] == 1: print(i,end =" ") print() else: checked[v] = 1 DFS(v+1) checked[v] = 0 DFS(v+1) if __name__ == "__main__": n = int(input()) checked= [0]*(n+1) DFS(1) 리스트를 하나 만들어 해당 노드로 가는지 여부를 판단하는 경우를 출력해주면 된다. DFS로 먼저 노드의 제일 왼쪽 부분으로 탐색을 한 뒤 다음 노드를 탐색한다. 이때는 조건을 다 돌았을..

[완전탐색][재귀 함수와 스택] - 트리 이진순회

def DFS(v): if v > 7: return else: print(v, end= " ") #전위 순회 DFS(v*2) #왼쪽 자식노드 = 부모노드 * 2 DFS(v*2+1) #오른쪽 자식 노드 = 부모노드 *3 if __name__ == "__main__": DFS(1) DFS(v*2) 왼쪽 노드부터 확인하며 왼쪽노드의 확인이 끝나면 오른쪽 노드의 확인을 시작한다. 이때 출력해주는 위치에 따라서 전위, 중위, 후위 순회가 바뀌게 된다.

[완전탐색][재귀함수와 스택] - 재귀함수와 스택

재귀함수와 스택 재귀함수가 돌 때 스택을 사용할 수 있는데 이를 어떻게 사용할 것인지를 살펴보자 #재귀함수와 스택 # 3 -> 2 -> 1 출력 def DFS(x): if x>0: print(x) DFS(x-1) # 1 -> 2 -> 3 출력 def DFS2(x): if x>0: DFS(x-1) print(x) if __name__=="__main__": n = int(input()) DFS(n) 재귀 함수를 사용하면 stack 형태의 메모리에 해당 정보가 올라가게 되고 이때 맨 위에 있는 부분부터 처리를 해 마지막은 해당 재귀함수를 부른 곳에서 끝낸다.

[자료구조 활용 ][스택, 큐, 해쉬, 힙] - 최소힙, 최대힙(힙, 힙)

문제 1) 자연수가 입력되면 최대힙에 입력한다. 2) 숫자 0 이 입력되면 최대힙에서 최댓값(최솟값)을 꺼내어 출력한다. (출력할 자료가 없으면 -1를 출력한다.) 3) -1이 입력되면 프로그램 종료한다. 최소힙 import heapq as hq a = [] while True: n = int(input()) if n == -1: break if n == 0: if len(a) == 0: print(-1) else: print(hq.heappop(a)) else: hq.heappush(a,n) 최대힙 import heapq as hq a = [] while True: n = int(input()) if n == -1: break if n == 0: if len(a) == 0: print(-1) else:..

[자료구조 활용][스택, 큐, 해쉬, 힙] - 애너그램(딕셔너리)

문제 애너그램은 두 문자의 배열은 다르지만 그 구성이 일치하는 경우를 의미한다. AADdde 라면 DedAdA는 총 A(2), D(1), d(2), e(1)개로 동일한 문자라고 판단한다. 문제 풀이 from collections import defaultdict s1= input() s2 = input() d = defaultdict(int) for s in s1: d[s] += 1 for s in s2: if s in d: d[s] = d[s] - 1 for dic in d: if d[dic] != 0: print("NO") break else: print("YES") s1의 문자 개수를 센다음 s2의 문자 개수를 빼줘서 다 안 빠져 있을 경우엔 "NO"를 출력 다 일치해서 빠진 경우라면 "YES"를 ..

[자료구조 활용 ][스택, 큐, 해쉬, 힙] - 단어찾기(딕셔너리)

n = int(input()) p = dict() for _ in range(n): word = input() p[word] = 1 for _ in range(n-1): word = input() p[word] = 0 for k,v in p.items(): if v == 1: print(k) 해당 문제는 딕셔너리를 통해서 단어 사용 여부를 체크해주는 문제이다. 이때 key를 정수가 아닌 문자로도 받을 수 있는 것이 딕셔너리의 특징이며 딕셔너리명.items()를 사용하면 key와 value에 접근할 수 있다.

[자료구조 활용 ][스택, 큐, 해쉬, 힙] - 교육과정 설계(큐)

from collections import deque need = input() for i in range(int(input())): plan = input() dq = deque(need) for p in plan: if p in dq: if p != dq.popleft(): print(f"#{i+1} NO") break else: if dq: print(f"#{i+1} NO") else: print(f"#{i+1} YES") 해당 과정에서 순서가 같더라도 중복입력으로 순서가 깨지면 안 된다. need = abc이고 plan = dcabc가 오면 abc가 있기는 하지만 c가 먼저 오는 바람에 순서가 무너진다는 의미이다. 이 문제에서는 이것을 막아놓았다. 입력 받은 plan에 순서에 문제가 없더라도 dq..

[자료구조 활용 ][스택, 큐, 해쉬, 힙] - 응급실(큐)

문제 환자 n명 중 m번째 환자가 몇번째로 진료받는지를 출력하라 문제풀이 from collections import deque n, m = map(int,input().split()) p = list(map(int,input().split())) cnt = 0 dq = [(pos,val) for pos, val in enumerate(p)] dq = deque(dq) while True: now = dq.popleft() #any = 반복가능한 자료형 중 단 하나라도 참이라면 참을 반환 #모든 요소가 거짓인 경우만 거짓 반환! if any(now[1] < x[1] for x in dq): dq.append(now) else: cnt += 1 if now[0] == m: print(cnt) break en..