일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백준 바이러스
- 백준 A->B
- 프로그래머스
- 백준
- 도커 컨테이너
- 백준 예산
- 백준 등수매기기
- 백준알파벳파이썬
- 지도자동구축 파이썬
- 백준 전쟁 파이썬
- 등수매기기 파이썬
- 소프티어 장애물인식프로그램
- 백준 평범한배낭
- express
- 피아노체조 파이썬
- 백준 전쟁-전투
- 금고털이 파이썬
- MongoDB
- 백준 점프
- 파이썬 평범한배낭
- 백준 피아노체조
- 소프티어 지도자동구축
- 파이썬데이터분석라이브러리
- 장애물인식프로그램 파이썬
- CRUD
- MySQL완전삭제
- express mongodb
- jenkins
- 1987파이썬
- 백준 점프 파이썬
- Today
- Total
바위 뚫는중
[BOJ] 큐 문제 - 11866 요세푸스 문제 0, 1966 프린터 큐 본문
11866 요세푸스 문제 0
생각 정리
1번부터 N번까지 N명의 사람이 앉아있음, K번째 사람을 순서대로 제거
원을 따라 계속해서 이 과정이 반복됨
원에서 사람들이 제거되는 순서를 N-K 요세푸스 순열 이라함
7, 3 요세푸스 순열은 3, 6, 2, 7, 5, 1, 4 이라함
N과 K가 주어지면 (N, K) 요세푸스 순열을 구하는 프로그램
⇒ 이게 3제거하고 다시 1,2,4여서 4제거하고 이런식이 아니라,
3을 제거하고 그뒤로 4,5,6이면 6이 3번째니 6을 제거하는 식
그리고 7,1,2가오니 2를 제거
1,2,3,4,5,6,7 KILL3
1,2,4,5,6,7 KILL 6
1,2,4,5,7 KILL 2
1,4,5,7 KILL 7
1,4,5 KILL 5
1,4 KILL 1
4 KILL 4
약간 이런 식이다 deque의 rotate를 사용해서 원하는 수보다 작을때마다 미리 회전시켜놓고 제일 앞에거를 popleft 해주는게 좋을 듯 싶다
풀이 코드 - 풀이만 맞음, 출력 미포함
from collections import deque
n, k = (map(int, input().split()))
yosep = deque()
yosep_answer = []
for i in range(1, n+1):
yosep.append(i)
for j in range(n): #n번 연산을 반복해야함
yosep.rotate(-k+1)
if yosep:
yosep_answer.append(yosep.popleft())
#yosep.popleft()
# yosep_answer.append(yosep.popleft())
# print(yosep)
print(yosep_answer)
맞았는데 출력이
< 숫자, 숫자, 숫자 > 이렇게 나와야하는데 ㅋ
[ 숫자, 숫자, 숫자 ] 요로케 나왔다
리스트 대괄호 없애는 법 print(*arr) * 요고를 붙여준다
리스트 대괄호는 없애는데 쉼표는 붙여야 할때 print(*arr, sep=’,’) 이렇게
*print( yosep_answer,sep=', ' ) 이렇게 해주면되는데, 또 < > 이괄호도 넣어줘야함,,ㅋㅋ 아,,,
*print("<", end='') print( yosep_answer,sep=', ', end='' ) print(">")
일케 해주면 된다! end=’’ 이거는 띄어쓰기나 기호등을 넣으면 한줄로 출력해준다. 출력땜에 한참을 해맴 심지어 쉼표뒤에 띄어쓰기도 필수임;; 이거땜에 계속 제출했다. 초보자니 이런거 일일이 신경써서 출력법을 연습하지만,,,이것도 공부라고 위로중이다.
정답맞은 코드
from collections import deque
n, k = (map(int, input().split()))
yosep = deque()
yosep_answer = []
for i in range(1, n+1):
yosep.append(i)
for j in range(n): #n번 연산을 반복해야함
yosep.rotate(-k+1)
if yosep:
yosep_answer.append(yosep.popleft())
#yosep.popleft()
# yosep_answer.append(yosep.popleft())
# print(yosep)
print("<", end='')
print( *yosep_answer,sep=', ', end='' )
print(">")
1966 프린터 큐
생각정리
큐의 숫자가
2 1 4 3
중요도가
A B C D 라면 C D A B 를 인쇄함 4→ 3 → 2→ 1 이런식
2 1 4 3 → 1 4 3 2 → 4 3 2 1
큐의 숫자가
1 1 9 1 1 1 이고, 0번째 숫자의 중요도의 출력순서는
1 1 9 1 1 1 → 1 9 1 1 1 1 → 9 1 1 1 1 1
5가 된다!
맨 앞의 숫자가 MAX 인지가 관건이다
즉, 맨 앞의 숫자가 MAX일 경우(더 이상 순서를 바꿀 필요가 없음!!), popleft() 해주고 카운트 +1, 인덱스 리스트는 하나씩 지워준다. 지워주다가 인덱스 리스트의 번호가 M과 같다면, 카운트를 print 해준다.
맨 앞의 숫자가 MAX가 아닐 경우(순서를 바꿔줘야 함!!), 가장 앞에 것을 맨 뒤로 보내준다
- 테스트 케이스 개수 n개
- 각 테스트 케이스마다의 문서 개수 N, 원하는 중요도 M
- 각 테스트 케이스의 문서 큐
- 문서의 인덱스를 담는 큐 (0 부터 n 까지)
- 문서의 출력 순서를 세기 위한 카운터 변수
풀이 코드
from collections import deque
n = int(input())
for i in range(n):
N,M = map(int, input().split())
L = deque(list(map(int, input().split())))
idx = deque(list(range(N)))
cnt = 0
while L:
if L[0] == max(L):
cnt += 1
L.popleft()
pop_idx = idx.popleft()
if pop_idx == M:
print(cnt)
else:
L.append(L.popleft())
idx.append(idx.popleft())
'Algorithms' 카테고리의 다른 글
[BOJ] 백준 1931. 회의실 배정 Java , Comparator 사용 (0) | 2023.07.19 |
---|---|
[SWEA] 1232. 사칙연산 Java (0) | 2023.07.19 |
[BOJ] 큐 문제 - 18258 큐 2, 2164 카드2 Python3 (0) | 2023.01.30 |
[BOJ] 스택문제 - 1874 스택 수열, 4949 균형잡힌 세상 Python3 (0) | 2023.01.29 |
[BOJ] 스택문제 - 9012 괄호, 10828 스택, 10773 제로 Python3 (0) | 2023.01.27 |