[Python] 백준 1544번: 사이클 단어

SeungHyun·2023년 10월 3일

coding test

목록 보기
10/16

0. 기본 정보

0-A. 개요

python/백준 - 1544번 문제에 대한 분석임.

0-B. 문제 정보

백준 - 1544번: 사이클 단어


1. 정답 코드

from collections import deque

def rotate_word(w1, w2):
    if len(w1)!=len(w2): return w2
    w2 = deque(w2)
    
    for _ in range(len(w2)):
        w2.rotate(1)
        t = ''.join(w2)
        if w1==t: return t
    
    return ''.join(w2)


n = int(input())
l = [input() for _ in range(n)]

for i in range(n):
    for j in range(i,n):
        if l[i]!=l[j]:
            l[j] = rotate_word(l[i], l[j])

print(len(set(l)))

2. 핵심풀이

  1. 2중 for문으로 list의 모든 요소를 전부 검사
  2. deque 모듈과 rotate 메소드로 list의 모든 요소를 전부 검사하여
    하나로 일치 시킬 수 있는 단어는 똑같이 일치하도록 변경
  3. set함수로 중복값 제거하고 고유값만 남긴 객체의 길이를 출력하여 문제 해결

2-a. 코드 분석

def rotate_word(w1, w2):
    if len(w1)!=len(w2): return w2
    w2 = deque(w2)
    
    for _ in range(len(w2)):
        w2.rotate(1)
        t = ''.join(w2)
        if w1==t: return t
    
    return ''.join(w2)
  • 2개의 단어(w1, w2)를 입력 받아서 w2를 회전시켜 w1과 똑같이 만들 수 있다면 회전시켜 w1과 똑같이 만든 후 해당 단어 반환해주는 함수
  • w1, w2의 길이가 다를 경우 서로 다른 단어기 때문에 그대로 w2를 반환
  • 길이가 같더라도 rotate해서 같은 단어가 되지 않는다면 서로 다른 단어이므로 그대로 w2를 반환

n = int(input())
l = [input() for _ in range(n)]

for i in range(n):
    for j in range(i,n):
        if l[i]!=l[j]:
            l[j] = rotate_word(l[i], l[j])

print(len(set(l)))
  • 2중 for문을 통해 list 내 모든 요소들을 검사
  • 서로 문자열이 다르다면 rotate_word 함수를 통해 회전시켜 똑같은 문자열로 만들 수 있는지 검사 후 변경이 가능하다면 변경
  • 회전하여 똑같은 문자열이 되는 문자열들은 서로 동일한 문자열로 변형되었고
    그 외 문자열은 그대로 남아있으니
    set객체를 활용하여 중복값 제거가 된 객체의 길이를 반환하면 그게 정답이 됨

profile
어디로 가야하오

0개의 댓글