알고리즘 45

[백준 알고리즘] 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) 문제접근방법 세줄 요약해서 나..

[백준 알고리즘] 2846. 오르막길 _ 파이썬

💻 문제 풀이 접근 방법 1) 일단 오르막만 다 추출한 뒤, 2) 오르막길이 끊어지지 않는 곳들은 다 더해서 오르막을 구한다. 3) max 값을 찾아 출력 저는 새로운 ways 라는 리스트를 만들어 오르막들을 추가했습니다 내리막이나 같은 경우는 0을 추가했구요. 그렇게 하면 오르막 앞뒤에는 0이 생기게 되므로 오르막을 더하고 0이 나올때마다 새로운 리스트에 오르막 값을 추가해서 이어지는 오르막길의 총 높이를 구하는 방법을 사용했습니다. N = int(input()) arr = list(map(int, input().split())) ways = [0] # 오르막길만 추출(오르막길경우에 차이 추가, 내리막 혹은 같으면 0) for i in range(len(arr)-1): diff = arr[i+1] - ..

[백준 알고리즘] 2798번 블랙잭 - 브루트포스 알고리즘, 파이썬

- 2798번 블랙잭 🎮 문제 접근 방법 1) 인덱스를 통해 3가지 카드를 뽑을 수 있는 경우의 수를 구한다 ex) 0, 1, 2 / 0, 1, 3 / 0, 1, 4 ...... - 단, 합은 blackjack 숫자를 넘지 못함! (=> blackjack에 해당하는 숫자가 나올때는 더이상 큰값이 없으므로 바로 출력 가능) 🎈 시간을 줄이기 위해서는 1) blackjack에 해당하는 숫자가 나올때는 바로 리턴하도록 2) 카드가 3개이므로 N-2까지만 돌면 된다. N, M = map(int, input().split()) arr = list(map(int, input().split())) def blackjack(N, M): max_val = 0 for i in range(N-2): for j in rang..

[백준 알고리즘] 1259. 펠린드롬 수_ 파이썬

🎮 문제 접근 방법 펠린드롬의 수란, 앞글자와 뒷글자를 차례대로 비교하면서 같은지 비교하는 것입니다. 그러므로 전체 길이 N에 2 나눈 몫만큼만 비교해주면 됩니다. 🎈 여기서 주의할 것은, 010은 해당 문제에서 펠린드롬의 수로 취급하지 않는다는 것입니다. 앞에 0은 정수형으로 봤을때 10이나 마찬가지이므로 무의미하다고 판별합니다. 그래서 저는 input 받을 때 int 정수형으로 바꿔 010이 10으로 들어오게 처리하였습니다. def pelindrome(num): N = len(num) for i in range(N//2): if num[i] != num[N-1-i]: return 'no' return 'yes' while True: num = int(input()) if num == 0: break ..