전체 글 71

[백준 알고리즘] 2309.일곱난쟁이 - 부분집합의 합(조합)

부분집합의 합이 100이 되도록 하면 되는 문제이다. 재귀를 사용해 풀었고, 만족하는 조건을 한번만 출력하면 되기에 flag 변수를 사용했다. 만족하는 경우 이후 재귀에서 바로 return 하도록 만들어 함수를 끝냈다. #### 부분집합의 합 -> 조합 def subset(idx ,cur_sum, start): global flag if flag == 1: return if idx == 7: if cur_sum == 100: flag = 1 select.sort() for i in select: print(i) return 1 return for i in range(start, 9): select.append(dwarfs[i]) subset(idx+1, cur_sum+dwarfs[i], i+1) sele..

[백준 알고리즘] 15652. N과 M (4) - 중복조합

중복을 허용하면서 조합으로 풀어야한다. 원래의 조합은 중복을 허용하지 않기에 뽑은 숫자 +1 부터 시작하는데 중복조합은 뽑은 숫자 부터 시작해서 중복하도록 만들어 주었다. #### 중복조합 N, M = map(int, input().split()) choice = [0] * M def comb_with_rep(idx, start): if idx == M: print(" ".join(map(str, choice))) return for i in range(start, N): choice[idx] = i+1 comb_with_rep(idx+1, i) comb_with_rep(0, 0)

[백준 알고리즘] 15650. N과 M (2) - 조합

조합문제이다. 순열과 비슷하면서도 다른데, 순열은 1,2 2,1 둘다 되지만, 조합은 1,2 만가능하다. 2 다음에는 2보다 작은 값이 올 수 없도록 처리하면 조합이 된다. 그래서 for의 범위를 넘겨주어 이전의 값+1 부터 뽑도록 했다. N, M = map(int, input().split()) select = [0] * M def comb(idx, start): if idx == M: print(" ".join(map(str, select))) return for i in range(start, N): select[idx] = i+1 comb(idx+1, i+1) comb(0, 0) for문을 통해서 보면 이해하는 데 더 편하다. arr = [1, 2, 3, 4, 5] N = len(arr) for ..

[백준 알고리즘] 15649. N과 M (1) - 순열

간단한 순열을 푸는 문제다. 왠지 순열문제는 기분이 나쁘다... ㅋㅋㅋㅋㅋㅋㅋ 중복되지 않는 순열이기에 visited로 중복검사가 필요하다. 만약 중복 순열이라면 visited를 빼면 된다. N, M = map(int, input().split()) num = [] visited = [0 for _ in range(N)] def perm(idx): if idx == M: print(" ".join(map(str, num))) return for i in range(N): if visited[i] == 0: num.append(i+1) visited[i] = 1 perm(idx+1) num.pop() visited[i] = 0 perm(0) 이것보다 더 빠르고 간단하게 순열을 구하려면 itertools에서..

[SWEA 1952] 수영장 - 파이썬

처음엔 어떻게 접근해야 할까 고민했는데, 힌트?를 얻고나니 문제가 아주 간단해졌다. 🎈 해당 달까지의 최소비용을 계산해 사용한다 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월 0 0 2 9 1 5 0 0 0 0 0 0 0 0 20 60 70 110 110 110 110 110 110 110 첫번째 행은 사용일수 두번째 행은 누적된 최소비용 T = int(input()) for tc in range(1, T+1): price = list(map(int, input().split())) plan = [0] + list(map(int, input().split())) expense = [0 for _ in range(13)] for i in range(1, 13): # 하루, 한달 비교..

[SWEA 1949] 등산로 - DFS, 파이썬

DFS 문제가 점차 익숙해지나 했더니 조금의 심화가 나오면 헤매게 된다. 아직 배운지 얼마 안됐고, 요새 장고를 배우느라.. 바빠져서 알고리즘 문제를 풀지 못하고 있다ㅠ 조급해하지 않기...ㅎㅎ 1일 1알을 목표로..!! 이전에 풀었던 DFS의 문제는 좌표 한개로부터 다른 좌표로 가는 거라 고려해야할 사항이 많지 않았다. 그런데 등산로 문제는 일단 시작하는 좌표가 여러개이고 언제끝날지 모른다. 그래서 끝나는 지점에서 1) 몇번 왔는지 체크해줘야 하며, 또한, 등산로를 한번 허용하는 길이만큼 줄일 때 줄인 것을 반영하되, 다른 등산로들에게는 영향을 주지 않아야 한다. 그래서 등산로 길이를 줄여야하는 상황에서는 등산로 길이를 줄인다음 temp 변수를 사용해 원상복구 시켜주었다. 처음에 deepcopy를 사용..

[백준 알고리즘] 10026. 적록색약 - 파이썬, DFS

🎈 처음에 sys.sys.setrecursionlimit(10000000) 설정해주지 않아 런타임에러가 걸렸다. 🎈 예제나 다른 복잡한 반례를 넣어봤을 때는 다 맞았는데, 제출하자마자 바로 틀렸다고 해서 처음에 조금 헤맸다. - > 원인을 찾아보니 for 문에서 iterator 반환 변수와 변수를 혼용해서 썼다.. 이런 기초적인 것들(?) 혹은 오타 때문에 생기는 오류들 때문에 때로는 문제푸는데 필요없이 오래걸리곤 한다... ㅠ 다신 까먹지 말자...ㅎㅎ 혹시 필요한 분들을 위해.. 제 오류를 찾은 반례도 함께 남겨 놓겠습니다.(제가 반례찾는다고 엄청 헤맸거든요..ㅠ) 2 BR GB 3 2 💻 딕셔너리를 사용해서 적록색약이 보는 R, G의 값은 동일하게, 일반 사람이 보는 R, G의 값을 다르게 설정했다..