파이썬

· 백준
n,m = map(int,input().split()) lst = [*map(int, input().split())] dic = {} for i in range(n): if lst[i] in dic: dic[lst[i]][0] += 1 else: dic[lst[i]] = [1,i,lst[i]] k = list(dic.values()) k.sort(key=lambda x: (x[0],-x[1]),reverse=True) for i in range(len(k)): for _ in range(k[i][0]): print(k[i][2], end=' ')
· 백준
코드 # 각 자리 수는 모두 1로만 구성되어 있기 떄문에 문자열로 1을 더해주는 방식으로 해결 # int형으로 1씩 더하면서 찾기엔 시간이 너무 오래걸림 while 1: try: n = int(input()) k = "1" while True: if int(k)%n == 0: print(len(k)) break k+= "1" except: break
· 백준
코드 n = int(input()) pa = input() astidx = pa.index("*") for _ in range(n): k = input() n = "" for i in range(len(k)-1,-1,-1): if len(n) == len(pa[astidx+1:]): break n += k[i] if(len(pa)-1
· 백준
코드 (스택 이용) # 1-3, 3-1 5-5 # 결국 사이클을 찾는 문제 -> 무방향 그래프는 dfs로 사이클 판별 가능 import sys input = sys.stdin.readline n = int(input()) numdict = dict() # 인접 리스트 방식, 1개당 1개씩만 짝지어져서 dict 사용 for i in range(1, n+1): x = int(input()) numdict[i] = x def dfs(x): stack = [x] visited[x] = 1 path = [x] flag = False while stack: pn = stack.pop() if numdict[pn] == x: flag = True # 여기서 바로 리턴해도 상관 X if not visited[numdi..
· 백준
코드 n,m = map(int, input().split()) lecture = [*map(int, input().split())] # 가장 큰 경우는 1개에 다 때려박았을 때의 시간 # 가장 작은 경우는 1개씩만 넣었을 때의 시간, 블루레이는 같은 크기여야하므로 가장 큰 값을 가짐 s,e = max(lecture), sum(lecture) while s mid: # mid보다 클 경우 개수 증가 및 시간 초기화 cnt += 1 temp = 0 temp += i if cnt > m: s = mid + 1 # 개수가 넣으려는 블루레이보다 많을 경우, 블루레이 용량을 늘려야함 else: e = mid - 1 # 그 외에는 용량을 줄임 print(s) 어떤 걸 변수로 두고 찾아야하는지 많이 헤맸던 문제. 그래..
· 백준
코드 # 특정 배열에서 크기가 고정인 부분 배열을 빠르게 처리해야한다 -> 슬라이딩 윈도우 from collections import deque n,m = map(int, input().split()) dnastring = input() cntlst = [*map(int, input().split())] cnt = 0 nstr = deque(dnastring[:m]) numdict = {"A":0, "C":0, "G":0, "T":0} for i in nstr: if i == "A": numdict[i] +=1 elif i == "C": numdict[i] +=1 elif i == "G": numdict[i] +=1 elif i == "T": numdict[i] +=1 if numdict["A"] >= ..
· 백준
코드 # 특정 배열에서 고정된 크기의 부분 배열을 처리 -> 슬라이딩 윈도우 n,m = map(int, input().split()) num_lst = [*map(int,input().split())] visited = sum(num_lst[:m]) # 연속된 날짜의 합 구하기(매일 변하는 값) res = visited # 결과를 저장할 값 (조건을 만족할 때마다 변하는 값) s = 0 days = 1 for i in range(m,n): temp = visited + num_lst[i] -num_lst[s] # 전날을 빼고 그 다음 날을 넣은 값 if temp > res: res = temp days = 1 elif temp == res: days += 1 s+=1 # 다음날로 visited = tem..
· 백준
코드 # n은 최대 100000, k는 n보다 작거나 같은 수 # 최악의 경우 10^10, O(nlogn) 이하로 해결해야함 n,k = map(int, input().split()) numlst = [*map(int, input().split())] res = -987654321 # -100이 100000개일 경우 대비해서 작은 수 할당 arr_sum = [0]*(n+1) # 구간합을 구해 줄 리스트 for i in range(1,n+1): arr_sum[i] = arr_sum[i-1] + numlst[i-1] for i in range(1,n+1): if i+k > n+1: break # 범위를 벗어나면 탈출 # ex)10일까지의 온도합에서 5일차까지의 온도합을 빼면 6~10의 온도 합이 나온다 tem..
· 백준
코드 # O(N^2+M)으로 해결할 수 있어야 한다 # O(N^2)인 이유는 2차원 배열의 구간합을 계산해야하므로 import sys input = sys.stdin.readline n,m = map(int, input().split()) numlst = [[0]*(n+1)] # 리스트 인덱스 1로 맞춰주기 위함 for _ in range(n): numlst.append([0,*map(int, input().split())]) arr_sum = [[0]*(n+1) for _ in range(n+1)] for i in range(1,n+1): for j in range(1,n+1): arr_sum[i][j] = numlst[i][j] # 구간합을 구해줄 자리에 더해줘야할 값 할당 arr_sum[i][j] ..
· 백준
코드 # 모든 노드의 depth의 합이 짝수면 No, 홀수면 Yes from collections import deque import sys input = sys.stdin.readline n = int(input()) cnt = 0 tree = [[] for _ in range(n+1)] visited = [0]*(n+1) # 방문기록 depth = [0]*(n+1) # 깊이를 기록할 리스트 for _ in range(n-1): x,y = map(int, input().split()) tree[x].append(y) tree[y].append(x) def bfs(): queue = deque() queue.append(1) visited[1] = 1 res = 0 while queue: pn = que..