[파이썬]백준 1242 소풍

Byeonghyeon Kim·2021년 4월 1일
0

알고리즘문제

목록 보기
51/93
post-thumbnail

링크

백준 1242 소풍


진짜 너무나도 많은 시간을 쏟은 문제이다.
이런문제를 풀 때면 내가 수학에는 별로 재능이 없나? 란 생각을 하게 된다.

실패한 코드의 아이디어는 지워진 사람 다음을 1로 바꿧을 때 동호의 위치를 계산해 주는 아이디어 였는데 방법은 맞는데 풀리질 않는다. 혹시 어디가 잘못된건지 보이신다면 부디 알려주세요...ㅠ

성공한 코드를 동호의 위치와 지워지는 사람의 위치를 보고 동호의 위치가 더 크면 1을 줄여주면서 계산하는 방법으로 풀었다.


실패코드

#사람, 움직이는수, 동호
N, K, M = map(int, input().split())
kill = K % N #만약 K가 N보다 클경우 다시 1부터 반복하게 만들어야 하므로 나머지 계산
if kill == 0: #만약 K가 N의 배수일 경우 마지막값을 죽이는데 값은 0이 나오므로 보정필요함
    kill = N
#지워진 숫자 다음을 1로 했을 때 동호의 위치를 계산, 반복
for i in range(1, N + 1):
    if M == kill or N == 1: #동호의자리가 지워질 자리와 같거나, 동호만 남았을 때
        print(i)
        break
    elif M > kill:
        M -= kill #지워진 사람 다음을 1로 했을 때 동호의 위치
        N -= 1 #사람이 한명 줄어듦
    elif M < kill:
        M = N + M - kill #이경우 M - K는 음수값, 뒤로 몇번째에 있다고 계산하면 됨
        while M <= 0:
            M = M + N
        N -= 1
        아니왜안돼 ㅡㅡ

정답 코드

N, K, M = map(int, input().split())
M -= 1 #동호의 인덱스
start = 0
for i in range(1, N + 1):
    removed = (start + K - 1) % N
    if removed == M:
        print(i)
        break
    if removed < M:
        M -= 1
    if removed > M:
        pass
    start = removed
    N -= 1

알게된 것👨‍💻

  • 수학적 사고력을 더 훈련해야겠다.
profile
자기 주도 개발전 (개발, 발전)

0개의 댓글