morijwana
수로그
morijwana
전체 방문자
오늘
어제
  • 분류 전체보기
    • 강의노트
    • Machine Learning
      • Pandas
      • NLP
    • Computer Science
      • Linux
      • TIL
    • Development
      • React
      • Swift
      • Javascript
    • 스터디 기록
      • Clean Code
      • 구글 BERT의 정석
      • 개발도서
      • 기타
    • Problem Solving
      • Baekjoon
      • ICPC Sinchon
    • 끄적
      • 끄적끄적
      • 요리왕

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래밍언어론
  • word2vec
  • 자연어처리
  • Bert
  • Python
  • 개발도서
  • ML
  • Pandas
  • 민트하임스터디
  • Solution Challenge
  • 회고
  • nlp
  • 구글BERT의정석
  • gdsc
  • GDSC Sookmyung
  • 데이터사이언스
  • cs224n
  • 구부정스터디
  • 백준
  • 프레임워크없는프론트엔드개발

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morijwana

수로그

Problem Solving/Baekjoon

백준 9519번 - 졸려(Python)

2020. 8. 12. 23:26

문제

https://www.acmicpc.net/problem/9519

 

9519번: 졸려

문제 선영이는 다가오는 COCI에 사용할 데이터를 만드느라 삼일동안 깨어있었다. 더 이상 데이터를 만들 수 없는 상황에 이르렀고, 심지어 선영이는 신경쇠약에 걸려 아무것도 제대로 보지 못하�

www.acmicpc.net

풀이

처음으로 생각해 낸 방법은 문제에 나와있는 셔플을 그대로 역으로 실행하는 것을 n만큼 반복하는 반복하는 것이었는데, 문제를 잘 보니 n 크기가 최대 10억이었다(...).
보통 이렇게 무언가를 반복해야 하는 문제인데 n값이 터무니없이 크다면 주기가 있는 경우가 많아서, 일단 문제에 나와있는 대로 코드를 짠 다음 주기를 찾아보려고 했다.
4~10글자로 셔플을 돌려보니 주기가 있는 것은 확실한데, 그 주기가 글자 길이와는 관련이 없어보였다. 그래서 직접 주기를 구해야 했는데, 200글자짜리 단어를 넣었을 때 주기가 171인 것을 보고 길이가 1000이어도 주기는 2000을 넘지 않겠다 싶어서 최대 반복 횟수는 2000으로 정했다.
위의 반복문에서 주기를 찾은 후에는, 원래 값에서 n(n < 주기)번 깜빡여서 입력받은 단어가 되었다면, 입력받은 단어에서 (주기 - n)번 더 깜빡이면 원래 값으로 되돌아간다는 점을 이용하여 정답을 구했다.

나의 코드

n = int(input())
string = input()
half = len(string) // 2 + (len(string) & 1)
str1 = list(string[:half])
str2 = list(string[half:])
cnt = 0

for i in range(2000):
    idx = len(string) // 2 - 1
    j = 1
    while idx >= 0:
        str1.insert(j, str2[idx])
        idx -= 1
        j += 2
    str2 = str1[half:]
    str1 = str1[:half]
    cnt += 1
    if (str1 + str2 == list(string)):
        break

period = cnt - n % cnt

for i in range(period):
    idx = len(string) // 2 - 1
    j = 1
    while idx >= 0:
        str1.insert(j, str2[idx])
        idx -= 1
        j += 2
    str2 = str1[half:]
    str1 = str1[:half]

print(''.join(str1 + str2))

첫번째 반복문이 주기를 찾는 반복문이고, 두번째 반복문이 정답을 찾는 반복문이다.
period = cnt - n % cnt는 n번 깜빡이기 전으로 돌아가는 것 == (주기-n)번만큼 더 깜빡이는 것을 이용해서 앞으로 몇 번 더 깜빡여야 할 지를 계산한 부분이다.

저작자표시 (새창열림)

'Problem Solving > Baekjoon' 카테고리의 다른 글

백준 14500번 - 테트로미노(C++)  (1) 2021.09.24
백준 2812번 - 크게 만들기(Swift)  (4) 2021.05.07
백준 2675번 - 문자열 반복(Python)  (0) 2020.02.27
백준 1431번 - 시리얼 번호(Python)  (0) 2020.02.18
    'Problem Solving/Baekjoon' 카테고리의 다른 글
    • 백준 14500번 - 테트로미노(C++)
    • 백준 2812번 - 크게 만들기(Swift)
    • 백준 2675번 - 문자열 반복(Python)
    • 백준 1431번 - 시리얼 번호(Python)
    morijwana
    morijwana
    행복한 휴학생의 devlog

    티스토리툴바