본문 바로가기

BOJ4

[ 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 ] 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.