본문 바로가기

백준6

[ BOJ ] 1652 누울 자리를 찾아라 - python 문제풀이 1652 누울 자리를 찾아라 접근 : 가로, 세로 배열을 따로 만들고, 각 배열을 넘겨서 개수 세기. '.' 이면 카운트를 늘려가다가 'X'가 나오면 카운트가 2 이상이면 전체 개수에 +1 해주고 안되면 그냥 카운트 0으로 초기화. 주의할 점은 for문을 다 돌고 나왔을 때도 다시 한번 초기화 해주는 작업을 해줘야 한다는 것 (X가 나오지 않았을 경우를 생각해서) 풀이방법 1. 인풋으로 받은 배열(가로 버전)을 세로 버전으로 더 만들기 2. 행 기준으로 순회하면서 '.' 개수 세고 'X'나오는 순간 누울 수 있을 만큼 카운트 쌓였는지(2) 확인 후 초기화 3. 만약 행을 빠져나왔다면 다시 한번 카운트 확인해주고 초기화 하는 작업 코드 중복으로 쓰기 싫어서 두 배열을 따로 만들었지만, 굳이 세로 버전을 다.. 2021. 7. 19.
[ BOJ ] 11724 연결 요소의 개수 - python 문제풀이 11724 연결 요소의 개수 접근 : 연결리스트로 간선으로 이어진 점 정보를 저장하되 재귀로 계속 탐색해가면서 연결된 점들은 제외시켜나가기 풀이방법 1. 연결 리스트 만들기 2. 방문 여부(이미 연결시킨 점인지의 여부) 확인할 배열 v 3. 재귀로 방문한 적이 없는데, 연결되어있는 점을 찾아 v 갱신해주기 참고 python3 로 풀려면 sys를 불러와서 재귀 깊이를 따로 설정해줘야 런타임에러(Recursion Error)가 나지 않는다고 한다. (내 코드는 그렇게 설정해도 시간 초과가 난다) 그래서 pypy3로 풀었더니 통과. def find(k): global v,d v[k]= 1 # 현재 도착한 점 방문 정보 갱신 for num in d[k]: # 지금 도착한 점에서 이동할 수 있는 다른 정점 if .. 2021. 7. 19.
[ BOJ ] 7562 나이트의 이동 - python 문제풀이 7562 나이트의 이동 접근 : 좌표와 이동횟수를 정보에 담아 리스트에 담고 덱에서 하나씩 꺼내보면서 확인 풀이방법 1. 나이트가 한 번에 이동할 수 있는 좌표들을 구해 [행좌표, 열좌표, 이동회차] 원소로 만들기 2. 덱에 정보들을 담고 매번 확인하되, 만약 넣기 전에 일치하는 좌표가 있으면 바로 break ''' 시작 좌표 i,j 나이트가 한 번에 이동할 수 있는 좌표들 i-2,j-1 / i-2,j+1 / i-1,j-2 / i-1,j+2 i+1,j-2 / i+1,j+2 / i+2,j-1 / i+2, j+1 ''' from collections import deque d = [(-2,-1),(-2,1),(-1,-2),(-1,2),(1,-2),(1,2),(2,-1),(2,1)] for tc in rang.. 2021. 7. 19.
[ BOJ ] 1759 암호만들기 - python 문제풀이 1759 암호만들기 접근 : 재귀로 문자열 조합 만들어가면서 지정한 길이(L) 만큼의 문자열을 완성했을 때 조건을 만족하면 결과에 추가, 아니면 중단 풀이방법 - 일단 먼저 알파벳 정렬 - 인덱스를 0부터 1씩 증가시키면서 재귀로 들어가기 - 마지막에 매번 모음, 자음 카운트 계산하지 않고, 모음 자음 개수 정보를 함께 넘겨주기 def make(s,mo,ja,idx): global stack if len(s) == L: if mo>=1 and ja>=2: print(s) return for i in range(idx,C): if al[i] in ['a','e','i','o','u']: make(s+al[i],mo+1,ja,i+1) else: make(s+al[i],mo,ja+1,i+1) L,C = map.. 2021. 7. 19.
[ BOJ ] 2309 일곱난쟁이 - python 문제풀이 2309 일곱난쟁이 접근 : 특정 인덱스의 난쟁이 선택O/선택X으로 재귀, 총합 조건을 백트래킹에 활용 풀이 방법 - 미리 난쟁이 키 순서대로 정렬 - 인덱스를 1씩 올려가면서 해당 순서의 난쟁이 선택하거나 안하거나 2가지로 재귀 - 도중에 백트래킹으로 시간 초과 방지 def find(cnt,s,idx,li): global r if r != []: # 이미 결과 찾았으면 중단 return if s > 100: # 100보다 커지는 순간 중단 return if idx == 9: # 모든 난쟁이를 지나왔을 때, if cnt == 7 and s == 100: # 조건을 만족하는 조합이 있다면 r = li # 결과로 지정하고 중단 return # idx 번째 난쟁이를 선택하거나 선택하지 않는 경우를 재귀로..... 2021. 7. 19.
[ BOJ ] 1260 DFS와 BFS - python 문제풀이 1260 DFS와 BFS 접근 : 기본 DFS, BFS 구현 문제라 별다른 전략은 세우지 않았고, 다양한 방법으로 풀어보려 했다 풀이 방법 1. 함수X while문으로 stack 활용해서 풀기 2. dfs는 함수 활용, bfs는 deque 활용하기 방법1. 함수 없이 while문 활용해서 푼 방법 N,M,V = map(int, input().split()) # 정점 i를 key, i와 연결된 정점들을 리스트에 담아 value로 갖는 딕셔너리 info info = {i:[] for i in range(1,N+1)} for _ in range(M): a,b = map(int, input().split()) info[a].append(b) info[b].append(a) # 문제 조건 : 정점이 작은 순서대로.. 2021. 7. 16.