본문 바로가기

알고리즘

(94)
파이썬 | 백준 | 2468 | 안전 영역 solution 1. dfs 이용 2. 빗물의 높이는 1이상 100이하 & 안 잠길 수도 있음 → for i in range(101) 3.sys.setrecursionlimit(50000) # 2468, 안전 영역 import sys sys.setrecursionlimit(50000) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] def dfs(h, x, y): visited[x][y] = 1 for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 h and visited[i][j] == 0: cnt += 1 dfs(h, i, j) return cnt N = int(sys.stdin.readline()) area = [] for _ in ra..
파이썬 | 백준 | 10546 | 배부른 마라토너 solution 1. dictionary 이용 2. 첫 번째 나오면 dictionary에 추가, 두 번째 나오면 dictionary에서 삭제 3. 마지막에 dictionary에 남은 이름이 완주하지 못한 참가자 # 10546, 배부른 마라토너 import sys N = int(sys.stdin.readline()) people = {} for _ in range(2*N-1): name = sys.stdin.readline().rstrip() if people.get(name) is None: people[name] = 1 else: del(people[name]) print(*people) 41672KB 208ms 문제 출처 https://www.acmicpc.net/problem/10546 10546번..
파이썬 | 백준 | 7562 | 나이트의 이동 | BFS solution 1. dx = [-2, -2, -1, -1, 1, 1, 2, 2], dy = [1, -1, 2, -2, 2, -2, 1, -1] 2. deque 이용 # 7562, 나이트의 이동 import sys from collections import deque dx = [-2, -2, -1, -1, 1, 1, 2, 2] dy = [1, -1, 2, -2, 2, -2, 1, -1] def bfs(x, y): q.append((x, y)) visited[x][y] = 1 while q: x3, y3 = q.popleft() if x3 == x2 and y3 == y2: return visited[x3][y3]-1 for i in range(8): nx = x3 + dx[i] ny = y3 + dy[i..
파이썬 | 백준 | 2309 | 일곱 난쟁이 | 조합(combinations) solution 1. 조합을 이용해 9개 중 7개를 뽑아 합이 100이면 출력한다. # 2309, 일곱 난쟁이 import sys from itertools import combinations dwarf = [int(sys.stdin.readline()) for _ in range(9)] # 조합을 이용해 9명 중 7명 뽑음 seven = list(combinations(dwarf, 7)) for i in seven: if sum(i) == 100: ans = list(i) break # 오름차순 출력 ans = sorted(ans) for ans_ in ans: print(ans_) 29380KB 60ms 문제 출처 https://www.acmicpc.net/problem/2309 2309번: 일곱 난..
파이썬 | 백준 | 2865 | 나는 위대한 슈퍼스타K | 소수 출력 solution 1. dictionary 이용 { 참가자 번호 : 점수 } 2. 소수 첫째 자리까지 출력 print('%.1f' % sum) # 2865, 나는 위대한 슈퍼스타K import sys # N: 예선 참가자 수, M: 장르, K: 본선 진출자 수 N, M, K = map(int, sys.stdin.readline().split()) candidate_score = {} for i in range(N): candidate_score[i+1] = 0 for i in range(M): genre = list(map(float, sys.stdin.readline().split())) for j in range(0, 2*N, 2): if genre[j+1] > candidate_score[genre[..
파이썬 | 백준 | 6603 | 로또 | 조합(combinations) solution 1. K개 중 6개 → 조합 from itertools import combinations # 6603, 로또 import sys from itertools import combinations lot = [] while True: lot = list(map(int, sys.stdin.readline().split())) if lot[0] == 0 and len(lot) == 1:# 0이면 실행 종료 break lot_com = list(combinations(lot[1:], 6))# 6개 뽑음 for lot_com_ in lot_com: print(*lot_com_) print() 29380KB 64ms 문제 출처 https://www.acmicpc.net/problem/6603 6603..
백준 | 파이썬 | 1012 | 유기농 배추 | sys.setrecursionlimit(50000) solution 1. dfs 이용 2. x를 열로, y를 행으로 생각해야 하므로 land[y][x] 3. land = [[0]*M]*N 하면 값이 같이 변함. land = [[0]*M for _ in range(N)] import sys dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] # 0 : 배추 X, 1 : 배추 O def dfs(x, y, arr): arr[y][x] = 2 # 2 : 방문 체크 for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0
파이썬 | 백준 | 1639 | 행운의 티켓 | list(map(int, list(sys.stdin.readline().strip()))) https://www.acmicpc.net/problem/1639 1639번: 행운의 티켓 첫째 줄에 문자열 S가 주어진다. 문자열 S는 1보다 크거나 같고, 9보다 작거나 같은 수만 입력으로 들어오며, 문자열의 길이는 100보다 작거나 같은 자연수이다. www.acmicpc.net solution 입력받은 문자열의 크기에서 2씩 줄이며 조건을 만족하는지 확인 # 1639, 행운의 티켓 import sys # 왼쪽 N자리 합과 오른쪽 N자리 합이 같은지 확인 def isLucky(x): mid = len(x) // 2 sum1 = sum2 = 0 for i in range(mid): sum1 += int(x[i]) sum2 += int(x[len(x)-1-i]) if sum1 == sum2: return..