백준 10026 적록색약 sys.setrecursionlimit (파이썬)
2022. 9. 3. 18:47
백준
아이디어 DFS를 미로찾기 형식으로 활용해서 구역 나누면 되겠다. 적록색약이 볼 때는 R과 B가 같으니 B를 R로 바꾸고 1의 작업을 다시 하면되겠다. 풀이 및 코드(해설) import sys sys.setrecursionlimit(10 ** 6) # 핵심!!!!!!!!!!! di = [0, 1, 0, -1] dj = [1, 0, -1, 0] def dfs(color, N, r, c): visited[r][c] = 1 for dr, dc in [[0, 1], [1, 0], [0, -1], [-1, 0]]: nr, nc = r + dr, c + dc if 0
백준 2667 단지번호붙이기 (파이썬)
2022. 9. 3. 18:14
백준
아이디어 BFS보다는 DFS탐색이 좋을 것 같다. DFS를 재귀함수로 만들고 함수가 실행된 횟수가 아파트의 수다. 한번 코드를 작성해보자 풀이 및 해설(주석) import sys def dfs(N, r, c): # dfs탐색 visited[r][c] = 1 # 일단, visited에 방문 표시 global total total += 1 # dfs가 실행 된다는 것은 주변에 아파트가 있다는 것, 아파트 수를 더해줌 for dr, dc in [[0, 1], [1, 0], [0, -1], [-1, 0]]: # 상,하,좌,우로 델타주기 nr, nc = r + dr, c + dc if 0
백준 2606 바이러스 (파이썬)
2022. 9. 3. 18:11
백준
아이디어 BFS를 활용해서 visited에 다녀간 것만 더해주면 된다. 풀이 및 해설(주석) from collections import deque import sys def bfs(v): # bfs 반복 코드 Q.append(v) # 일단, 시작점을 Q에 넣어준다. D[v] = 0 # D는 시작점 부터의 거리 visited[v] = 1 # visited 방문 해주고 while Q: # Q가 빈 리스트가 될 때 까지 v = Q.popleft() # Q의 제일 앞인덱스를 뽑아준다. for w in G[v]: # 노드가 갈 수 있는 곳 if not visited[w]: # 방문하지 않았다면 Q.append(w) # 그 노드를 Q에 append visited[w] = 1 # visited 방문하고 D[w] = ..
백준 1181 단어 정렬 sorted, lambda (파이썬)
2022. 8. 29. 21:14
백준
아이디어 그냥 정렬할 때 lambda 써보라고 만든 문제같다. 정렬할 때, key를 lambda로 주고, 선순위, 후순위를 만들면 될 것 같다. 풀이 및 해설(주석) import sys N = int(sys.stdin.readline()) arr = set() for i in range(N): # 중복된 원소가 들어가면 안되니까 set으로 넣어준다. arr.add(sys.stdin.readline().rstrip()) list(arr) result = sorted(arr, key=lambda x:(len(x), x)) # 정렬에 lambda사용, 1순위는 길이, 2순위는 알파벳순... for r in range(len(result)): sys.stdout.write(result[r]) # 처음 sys.s..
백준 1094 막대기 (파이썬)
2022. 8. 29. 16:57
백준
아이디어 일단, 문제를 이해하기가 어렵다. 대충 막대기를 반으로 짜르고 가지고 있는 막대의 길이의 합이 원하는 숫자가 나올 때, 막대기는 몇개냐 라고 해석함. 비트 연산자를 이용해 경우의 수를 가지고 해봤더니, 맞았다. 풀이 및 해설(주석) N = int(input()) # 일단 64길이의 막대가 있으니, 잘라서 만들 수 있는 막대기의 길이를 다 넣어줬다. stick = [64, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2, 1, 1] for i in range(1
백준 2559 수열 (실행 시간 줄이기) (파이썬)
2022. 8. 28. 22:03
백준
풀이 및 해석(주석) import sys N, K = map(int, sys.stdin.readline().split()) tmp = list(map(int, sys.stdin.readline().split())) lst = [] lst.append(sum(tmp[:K])) # 미리 첫 번째 요소 부터 K번 까지의 수를 더해준 값을 lst에 넣어준다. result = -0xfffffff for i in range(0, N-K): lst.append(lst[i] - tmp[i] + tmp[K+i]) # 이 과정에서 sum을 이용하지 않고 lst의 i값과 # tmp의 인덱스를 조절 해서 뺴주고, 더해준다. lst.sort() print(lst[-1]) 후기 문제 자체는 쉽지만, 최적화 문제였다. 풀이의 핵심..
백준 10163 색종이 (파이썬)
2022. 8. 28. 19:54
백준
풀이 및 해석(주석) N = int(input()) info = [list(map(int, input().split())) for _ in range(N)] max_r = max_c = 0 for n in info: # 1000행, 1000열을 미리 만들기 싫어서 최대 행값과 열값을 뽑아준다. if (n[2]+n[0]) > max_c: max_c = (n[2]+n[0]) if (n[3]+n[1]) > max_r: max_r = (n[3]+n[1]) arr = [[0]*(max_c+1) for _ in range(max_r+1)] for s in range(N): r, c, w, h = info[s][0], info[s][1], info[s][2], info[s][3], for i in range(c, c..
백준 10157 자리배정 (파이썬)
2022. 8. 28. 15:10
백준
아이디어 달팽이라는 문제를 풀었다면, 간단하게 풀 수 있을 것이다. 기준점을 잡는다. 행은 마지막 행, 열은 첫 번째 열 K번을 채울 때 까지 상, 우, 하, 좌 순으로 숫자를 채워나간다. 그 행, 열 위치를 참고하여 출력하는데, 열은 그냥 열+1이고, 행은 처음 받은 행의 수에서 그 자리의 인덱스 행 번호를 빼주면 된다. 풀이 R, C = map(int, input().split()) arr = [[0]*R for _ in range(C)] K = int(input()) if K > R*C: print(0) exit() dr = [-1, 0, 1, 0] dc = [0, 1, 0, -1] r = C -1 c = 0 arr[r][c] = 1 cnt = 0 k = 0 while arr[r][c] != K: ..