알고리즘 문제 풀기 61

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

피보나치 구현(재귀, 메모이제이션) _ 파이썬

# 재귀 def fibo(n): if n < 2: return n return fibo(n - 1) + fibo(n - 2) for i in range(1, 11): print('fibo({}) = {}'.format(i, fibo(i))) # 재귀 + 메모이제이션 memo = [0] * 11 memo[1] = 1 def fibo_memo(n): if n < 2 or memo[n]: return memo[n] memo[n] = fibo_memo(n - 1) + fibo_memo(n - 2) return memo[n] fibo_memo(10) for i in range(1, 11): print('memo[{}] = {}'.format(i, memo[i])) # 반복 + 메모이제이션 memo = [0] * ..

SWEA 1216. 회문 2 - 파이썬

SWEA 1216. 회문 2 def find_palindrome(N, arr): ans = '' for n in range(100): # 돌아가는 갯수 늘리기 for s in range(n+1): # 탐색 위치 바꾸기 for r in range(N): # 한줄씩 바꾸기 flag = True M = N - n #가로 for idx1 in range(M // 2): # 앞뒤 비교하는것 start = s + idx1 end = s + M - 1 - idx1 if arr[r][start] != arr[r][end]: flag = False break if flag: return len(arr[r][s:s + M]) #세로 flag = True for idx2 in range(M // 2): # 앞뒤 비교하는것 ..

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

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

[SWEA 1223] 계산기2 - 스택을 이용한 후위표기식

SWEA 1223 계산기2 스택을 이용하여 계산기 기능을 구현하는 것이다. 처음 후위표기식을 볼땐 이게 뭐야;; 싶었는데 보면 볼수록 어떻게 이런 생각을 했나 싶다..ㅎㅎ 그리고 그냥 연산하면 되는데 왜 굳이 할까? 라는 의문이 들어 찾아보니 괄호 없이 연산자의 우선 순위를 판단할 수 있다는 장점을 가져 소프트웨어로 구현되는 계산기들은 후위표기법을 사용한다고 한다. 🎈 3가지로 나눠서 구현했다. 1) 우선순위 판별 2) 중위표기식 -> 후위표기식 3) 후위표기식을 계산 # 우선순위 def priority(char): if char == '*': return 3 if char == '+': return 2 else: return 1 # 중위 -> 후위 def make_postfix(): stack = []..

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

[백준 알고리즘] 1713번 후보 추천하기 - 파이썬

1713번 후보 추천하기 🎮 문제접근 방법 - 사진이 올라간 경우에는 1추가 - 사진을 새로 올려야 하는 경우 1) 사진 틀이 꽉 차지 않았다면 1로 지정 2) 사진 틀이 꽉 차있는 경우 사진의 min 값을 찾아 제거한뒤 추가 2-1) min값이 2개이상일 경우, 오래된 값을 찾아 제거하고 추가 저는 위와 같이 로직을 짜봤습니다. 리스트와 딕셔너리 중에 어떤걸 사용할지 고민했는데요. 후보의 숫자와 추천수를 같이 짝지우기 위해서 저는 딕셔너리를 선택했습니다. 가능한 후보 숫자(100) 리스트를 새로 만들어서 거기서 count 하는 방식도 가능하더라고요! 🎈 주의할 점 저는 오래된 값을 처음 입력받은 투표한 리스트에서 세고, 나가게 되는 경우는 값을 -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..