백준 49

[백준 알고리즘] 2606. 바이러스 - DFS(깊이우선탐색)

2606. 바이러스 DFS 처음 배우고나서 제대로 푼 첫문제인데, 토할 뻔 했다... 문제 자체는 어렵지 않았으나, 백트래킹 배우다가 DFS문제 다시 풀려니 기억이 잘 나지 않아 꽤나 헤맸다.... 이제는 다시 안 헤매겠지...? ㅎㅎ 빨리 DFS 문제가 익숙해지는 날이 오길.... def DFS(v): visited[v] = 1 stack.append(v) while stack: for w in Graph[v]: if visited[w] == 0: visited[w] = 1 stack.append(v) v = w break else: v = stack.pop() return sum(visited)-1 V = int(input()) E = int(input()) Graph = [[] for i in ra..

카테고리 없음 2021.02.25

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

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

[백준 알고리즘] 8979. 올림픽 _ 파이썬

💻 문제 풀이의 2가지 방법 - 딕셔너리 사용 - 2차원 배열사용 문제에 답이 있다고, 문제 잘 읽으라는 소리를 초등학생부터 들어왔던 것 같은데.. 이 문제가 딱 문제에 해답? 힌트? 가 있는 문제였습니다. 6번째 줄에 자신보다 더 잘한 나라수 + 1 라고 되어있으니, 자신보다 더 잘한 나라수만 체크하면 되겠구나! 라는 아이디어를 문제를 통해 얻었습니다 그리고 조심해야할 부분이자, 처음에 제가 놓쳤던 부분이기도 한데요. - 동메달이 아무리 많아도 1000개가 있어도, 금메달이 1개 있으면 금메달을 가진 나라가 높은 순위라는 것입니다. 즉, 합산으로 풀 수 없고, 금메달부터 봐야 한다는 거죠 (물론, 메달수 의 총합이 1,000,000 이하로 정해져 있기 때문에 가중치를 두어 합산으로 푸는 경우도 있었습니..

[백준 알고리즘] 2847. 게임을 만든 동준이 _ 파이썬

💻 문제 풀이 접근 방법 1) 점수 리스트 만들고 2) for 문 돌려서 다음 숫자의 차이 만큼 감소 3) 계산하는 값 누적하기 🎈 여기서 실수하기 좋은데, 오름차순으로 for문을 돌리며 반례로 레벨 4, 4 5 6 4 가 있습니다. 이럴경우 6만 3으로 바꾸고 for문이 끝나게 되서 틀린 정답이 나옵니다. 그러므로 전체 값을 오름차순으로 만들경우 뒤에서부터 접근해야합니다!! 저도 처음에 이걸 간과했어요ㅠㅠ # 입력받아서 각 레벨별 점수 리스트 만들기 level = int(input()) scores = [0] * level for i in range(level): scores[i] = int(input()) # 점수 차이만큼 빼주고, cnt에 추가해서 세기 cnt = 0 for i in range(le..

[백준 알고리즘] 2804. 크로스워드 만들기 _ 파이썬

💻 문제 풀이 접근 방법 1) A와 B의 공유 글자를 A를 기준으로 찾고 글자와, A의 idx 저장 (공유 글자가 여럿인 경우 A에서 제일 먼저 등장하는 글자가 공유 글자이기 때문) 2) B에서의 공유 글자 위치를 찾고 3) 각각의 idx 값을 이용해 출력 A, B = input().split() # 공유글자 찾기 for i in range(len(A)): if A[i] in B: share = A[i] A_idx = i break # B에서의 공유 글자 위치 찾기 for i in range(len(B)): if B[i] == share: B_idx = i break result = ['.'] * len(A) for i in range(len(B)): result[A_idx] = B[i] if i == ..

[백준 알고리즘] 2953. 나는 요리사다 _ 파이썬

💻 문제풀이 접근 방법 1) 입력받으면서 총점 더하기 2) max, max_idx 값 구해서 출력 별로 어렵지 않은 문제라 금방 풀었지만, 처음 풀었을 때는 코드가 깔끔하게 잘 안 써진다ㅠㅠ 풀고 나서 코드 최적화를 해보면 굳이 적지 않아도 될 필요없는 코드가 보이곤 한다! 반복과 연습만이 길인듯 하다..ㅎㅎ max = 0 max_idx = 0 for i in range(1,6): s = sum(int(x) for x in input().split()) if max < s: max = s max_idx = i print(max_idx, max) www.acmicpc.net/problem/2953 2953번: 나는 요리사다 "나는 요리사다"는 다섯 참가자들이 서로의 요리 실력을 뽐내는 티비 프로이다. 각 ..