알고리즘 문제 풀기/백준(Baekjoon) 47

[백준 알고리즘] 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에서..

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

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

[백준 알고리즘] 1012 유기농배추 _ 파이썬, dfs

https://acmicpc.net/problem/1012 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 1) DFS를 사용해서 양배추 밭을 한번씩 돌아다니면서 배추가 있는지 판별했고 있는 경우 해당 배추와 인접해 있는 배추를 다 0으로 만들어 다시 방문하지 못하도록 했다. # M은 배추밭의 가로, N은 세로, k는 배추가 심어져 있는 위치의 개수 # 델타 이동을 통해서 인접한 배추밭들 세기 import sys delta = [(0, 1), (0, -1), (1, 0), (-1, 0)] for _ in range(int..

[백준 알고리즘] 1244. 스위치 켜고 끄기 - 파이썬

1244. 스위치 켜고 끄기 문제를 풀기 전에 먼저 작게 나눠서 생각하려 노력을 많이 하는데, 그렇게 하는 이유는 1) 작게 생각하는 과정 없이 무작정 들이댔다가 오히려 더 돌아감. 2) 작게 생각하면 문제 접근하기도 용이함. 결국 2개다 문제를 조금 더 쉽게 접근할 수 있다는 같은 이유인 것 같다. 이 문제도 당연히 남자, 여자를 나누어서 풀었다. 남자인 경우, 배수 일때 스위치를 바꿔주어야 하므로 range를 이용해 간격을 두어 배수만 찾아다니도록 했다. 여자인 경우, 전체길이의//2 만큼 탐색하도록 했다.(양쪽을 탐색하므로) 그리고 스위치의 상태를 바꾸는 것은 남자나 여자나 공통적으로 필요함으로 따로 함수를 두어 사용해 코드를 간결하게 하도록 했다. def change(num): if switch[..

[백준 알고리즘] 1018번 체스판 다시 칠하기 - 브루트포스, 파이썬

1018 체스판 다시 칠하기 🎮 문제접근 방법 1) 체스판의 첫번째 좌표가 움직일 수 있는 위치를 구한다. 2) 좌표를 기준으로 오른쪽으로 8칸, 아래로 8칸 움직이며 W, B인지 확인한다. 3) 첫줄이 WBWBWBWB와 BWBWBWBW인 경우 2가지를 고려해야 하므로 count1, count2로 나눠 색칠해야 하는 숫자를 각각 구한다. 5) 구한 count1, count2들의 min 값을 구함. 🎈 예제 문자를 잘못봐서 처음에 문제를 이해하는 데 한참 걸렸다.. 문제를 꼼꼼히 또 꼼꼼히 읽어야 실수를 방지할 수 있음을 느끼게 해주는 문제였습니다. 특히, WBWBWBWB와 BWBWBWBW 2가지 경우를 간과하는 경우가 많은 것 같았습니다~ => 1) 문제 꼼꼼히 읽고, 2) 문제접근방법 세줄 요약해서 나..