자료구조와 알고리즘/개인적인 코딩테스트 관련 풀이 60

[자료구조 활용 ][스택, 큐, 해쉬, 힙] - 공주 구하기(큐)

문제 공주를 구하기 위해서 n명의 왕자가 지원을 하는데 이때 돌아가며 m번째 왕자는 빠지는 식이다. m번째 왕자가 빠졌다면 다시 1번부터 시작하는 구조로 진행된다. 문제 풀이 from collections import deque n, m = map(int,input().split()) prince = list(range(1, n+1)) dq = deque(prince) while dq: for _ in range(m-1): dq.append(dq.popleft()) dq.popleft() if len(dq) == 1: print(dq[0]) break 맨 앞의 왕자를 빼내 다시 큐의 끝에 다시 넣어준다. m번째에 있는 왕자를 만나면 그 왕자는 아예 빼주는 식으로 진행한다. 이때 큐에 있는 왕자가 1명만 ..

[자료구조 활용][스택, 큐, 해쉬, 힙] - 후위 연산(스택)

#해당 연산자 앞에 있는 2개의 숫자를 피연산자로 계산하고 다시 append해준다. s = input() stack = [] for i in s: if i.isdecimal(): stack.append(int(i)) else: if i == "+": b = stack.pop() a = stack.pop() stack.append(a+b) elif i == "-": b = stack.pop() a = stack.pop() stack.append(a-b) elif i == "*": b = stack.pop() a = stack.pop() stack.append(a*b) elif i == "/": b = stack.pop() a = stack.pop() stack.append(a/b) print(stack[0..

[자료구조 활용][스택, 큐, 해쉬, 힙] - 후위 표기식 만들기(스택)

s = input() stack = [] res = "" for i in s: if i.isdecimal(): res+= i else: #숫자가 아닌 경우 if i == "(": stack.append(i) elif i =="*" or i =="/": while stack and (stack[-1] == "*" or stack[-1]=="/"): res += stack.pop() stack.append(i) elif i == "+" or i == "-": while stack and stack[-1] != "(": res += stack.pop() stack.append(i) elif i ==")": while stack and stack[-1] != "(": res += stack.pop() stack..

[이분탐색(결정알고리즘)][그리디 알고리즘] - 침몰하는 타이타닉(그리디 알고리즘)

오답 n,m =map(int,input().split()) weight = list(map(int,input().split())) weight.sort() cnt = 0 s= 0 for i in range(n): print(weight[i]) if s + weight[i] m: weight.pop() cnt += 1 else: weight.pop(0) weight.pop() cnt += 1 print(cnt) 요소가 1개 남았을 땐 보트에 혼자 태우고 반복문을 종료시킨다.

[이분탐색(결정알고리즘)][그리디 알고리즘] - 창고 정리(그리디 알고리즘)

#높이 조정 = 가장 높은 곳에 있는 상자를 가장 낮은 곳에 있는 곳으로 옮기는 것! L = int(input()) a = list(map(int,input().split())) a.sort() m = int(input()) for i in range(m): a[0] += 1 a[-1] -= 1 a.sort() print(max(a) - min(a)) m번 반복해야 하니 m번을 반복으로 돌려주며 제일 작은 값은 +1 해주고 제일 큰 값은 -1 해주며 진행한다. 이때 매번 제일 작은 값과 큰 값은 변할 수 있기에 sort 해주어야 한다. 출력은 제일 큰 값에서 제일 작은 값을 해주면 된다

[이분탐색(결정알고리즘)][그리디 알고리즘] - 씨름 선수(그리디 알고리즘)

문제 n명의 씨름선수 중 A라는 선수보다 키도 크고 몸무게도 더 나가면 A 선수는 선출되지 못한다. 이때 n명의 선수 중 선출될 수 있는 선수는 몇명인지 구하여라 문제 풀이 - 1 n = int(input()) player = [tuple(map(int,input().split())) for _ in range(n)] cnt = 0 player.sort(reverse = True) end_weight = 0 fp = 0 #키순으로 정렬하면 그 전에 사람보다 키가 작으니 몸무게를 비교해야 된다. for h,w in player: if fp h: if end_weight < w: cnt += 1 end_weight = w pri..

[이분탐색(결정알고리즘)][그리디 알고리즘] - 회의실 배정(그리디 알고리즘)

문제 n개의 회의시간이 주어지면 최대한 회의를 많이할 수 있도록 하여라 문제 풀이 n = int(input()) meeting = [tuple(map(int,input().split())) for _ in range(n)] meeting.sort(key= lambda x: (x[1],x[0])) cnt = 0 end_time = 0 for s, e in meeting: if s >= end_time: end_time = e cnt += 1 print(cnt) 그리디의 경우 정렬된 데이터를 이용해 최선으로 좋은 답을 선택하는 문제이다. 회의 시간의 경우 (시작 시간, 끝나는 시간)을 튜플 형태로 리스트에 넣어두고 끝나는 시간을 기준으로 정렬해 시작하는 시간과 비교해준다. 시작 시간이 끝나는 시간보다 이른 ..

[이분탐색(결정알고리즘)][그리디 알고리즘] - 마굿간 정하기(결정 알고리즘)

문제 주어진 n마리 만큼의 말이 주어진 거리에 존재한다고 할 때 최대의 거리에 c마리 만큼 놓을 수 있는 수를 찾아라 문제 풀이 def Count(mid): cnt = 1 #무조건 첫 위치는 인덱스 0번부터 시작! end_point = Line[0] #0번 자리엔 이미 확인 했기 때문에 1~n까지 for i in range(1, n): if Line[i] - end_point >= mid: cnt += 1 end_point = Line[i] return cnt n, c = map(int,input().split()) Line = [int(input()) for _ in range(n)] Line.sort() lt = 1 rt = Line[n-1] res = 0 while lt = c: res = mid ..

[이분탐색(결정알고리즘)][그리디 알고리즘] - 뮤직비디오(결정 알고리즘)

문제 주어진 뮤직비디오를 m개로 나눠서 사용할 때 최소 길이로 맞출 수 있는 방법을 풀어라 (m개보다 갯수가 작아도 되나 그렇게 되면 최소 길이라는 조건이 충족되지 않음) 문제 풀이 - 1 def Count(mid): s = 0 cnt = 1 for i in music: if s + i > mid: cnt += 1 s = i else: s+=i return cnt n, m = map(int,input().split()) music = list(map(int,input().split())) lt = 1 rt = sum(music) res = 0 while lt