[백준] 11866번 : 요세푸스 문제 0 (파이썬)

뚝딱이 공학도·2022년 3월 9일
0

문제풀이_백준

목록 보기
82/160



문제



나의 답안

n,k=map(int,input().split())
se=[] #1부터 n까지 저장할 배열
arr=[] #최종 값을 저장할 배열
idx=0 #현재위치 저장할 변수

for i in range(1,n+1):
    se.append(i)
    
while se:   #1~n까지의 배열(se)이 모두 끝날때까지 반복
    idx+=k-1 #k전까지는 유지(k번째는 제거된다)
    if idx>=len(se):    #현재 위치가 배열의 인덱스를 넘어가면 배열을 한바퀴 돈 것이므로
        idx%=len(se)    #새로운 값을 찾기 위해 나머지로 인덱스의 위치조정
    tem=se[idx] #삭제할 값 임시저장
    del se[idx] #배열의 범위를 지정해서 삭제하기 위해 del사용
    arr.append(tem) #삭제됐던 값을 새로운 배열에 추가

print("<"+", ".join(map(str,arr))+">",end="")

접근 방법

  • 현재 인덱스는 배열의 전체길이를 넘으면 안되므로(오류남), 새로운 값을 찾기 위해 나머지로 인덱스의 위치조정할 필요가 있다.
  • k번째 값을 삭제하기 위해, k번째에 해당하는 인덱스를 계산해 값을 찾는다.
  • k번째 값을 삭제하기 전, tem변수에 k번째 값을 저장한다.
  • 원래 배열에서 k번째 값을 삭제한다.
  • 삭제된 값(k번째 값)을 새로운 배열(arr)에 추가한다.
  1. 변수를 선언해준다.
  2. 반복문으로 se배열에 1부터 n까지의 값을 저장한다.
  3. while문으로 se배열이 끝날 때까지 반복한다.
  4. 현재 위치 인덱스(idx)를 k-1이하로 유지한다.
  5. 만약 idx가 배열의 길이보다 길다면, 배열을 한바퀴 돈 것이고, 배열의 전체 길이를 넘었다는 이야기이므로 배열의 전체길이로 나누어준다.
  6. 삭제할 값을 임시변수(tem)에 저장하고,
    del을 사용하여 현재 인덱스 값에 해당하는 값을 삭제한다.
  7. 그리고 최종 배열(arr)에 삭제했던 값을 추가해준다.
  8. 출력은 각 문자 사이 공백이 필요하지 않으므로 +로(,콤마는 x) 연결해주고, 배열의 값을 출력하기 위해 join과 map을 사용하였다.

0개의 댓글