문제풀이 324

[백준][문자열] - 10798. 세로읽기

# 해당 문자가 없을 경우 0으로 만들어서 판별할 수 있게 한다. #최대 15개의 문자를 5줄로 넣을 수 있는 리스트 생성 res = [[0]*15 for _ in range(5)] for i in range(5): line = input() length = len(line) for j in range(length): res[i][j] = line[j] for i in range(15): for j in range(5): if res[j][i] == 0: continue else: print(res[j][i], end ="") 초기화를 0으로 해준 리스트에 해당 문자들을 넣어주었기 때문에 마지막에 판별할 때 for문을 세로부터 돌 수 있게 했고 이때 해당 값이 0이면 continue로 넘겨 해당 2차원 ..

[백준][두 포인터] - 7795. 먹을 것인가 먹힐 것인가

for _ in range(int(input())): n,m = map(int,input().split()) a = list(map(int,input().split())) b = list(map(int,input().split())) a.sort() b.sort() res = 0 cnt = 0 #반복문을 돌아가며 해당 누적 쌍을 기록할 변수 for start in range(n): while True: if cnt == m or b[cnt] >= a[start]: res += cnt break else: cnt += 1 print(res) 완전 탐색을 사용해(2중 for문 사용시) 풀면 시간초과가 뜬다. 이 문제는 합을 누적해가는 식으로 진행해야하고 이를 위해 비교하려는 리스트와 비교되는 리스트를 정렬시..

[백준][수학] - 3029. 경고

sh, sm, ss = map(int,input().split(":")) eh, em, es = map(int,input().split(":")) a = (sh * 60 * 60) + (sm * 60) + ss b = (eh * 60 * 60) + (em * 60) + es res = 0 if a < b: res= b-a else: res = b - a + 24*60*60 h = res//60//60 m = res//60%60 s = res%60 print("%02d:%02d:%02d" %(h,m,s)) 초기 아이디어로는 해당 문제를 초가 빼야 할 수보다 작을 때 60을 가져오고 분에서 -1을 해주는 식으로 진행했는데 이보다 아예 전체 시간을 초단위로 바꿔 빼주고 이때 처음시간보다 후에 시간이 작은 경우..

[백준][슬라이딩 윈도우] - 21921. 블로그

오답 from collections import deque n,x = map(int,input().split()) visited = list(map(int,input().split())) visited = deque(visited) days = 0 res = [] while visited: if len(visited) < x: break sumQ = 0 for i in range(x): sumQ += visited[i] visited.popleft() res.append(sumQ) if sum(res) == 0: print("SAD") else: print(max(res)) print(res.count(max(res))) 초기 아이디어로는 q로 해당 방문자 수를 담아 x만큼 돌고 맨 앞에 부분을 빼주는 ..

[백준][투포인터] - 20922. 겹치는 건 싫어

#최장 연속 부분 수열 길이 출력 n,k = map(int,input().split()) a = list(map(int,input().split())) cnt = [0] *(max(a)+1) start = end = 0 answer = 0 while end < n: #해당 수가 k개 이하로 들어 있으면 범위를 늘려준다.(오른쪽으로) if cnt[a[end]] < k: cnt[a[end]] += 1 end += 1 else: #범위를 줄여주는데 이때 start부분의 하나를 빼주어야 한다. (그래야 다음 길이 탐색이 계속 됨) cnt[a[start]] -= 1 start += 1 answer = max(answer, end - start) print(answer) k를 넘어가지 않을 때는 그냥 해당 번호(인..

[백준][투포인터] - 3273. 두 수의 합

n = int(input()) a = list(map(int,input().split())) x = int(input()) cnt = 0 left, right = 0, n-1 a.sort() while left x: right -= 1 else: cnt += 1 left += 1 right -= 1 print(cnt) 정렬해서 맨 앞 수와 맨 뒤의 수를 더해본 뒤 x보다 작을 때는 앞 수를 한 칸 뒤로 옮겨(더 큰수로 갈 수 있게)준다. x보다 두 수를 더한 값이 더 클때는 right를 가르키고 있는 포인터를 앞쪽으로 옮겨(더 작은 수로 갈 수 있게)준다. 두 수의 합이 해당 ..