파이썬 코딩테스트 강좌, DDR을 해보자

안녕하세요! 이번 포스팅에서는 파이썬을 이용한 알고리즘 문제 해결에 대해 다뤄보겠습니다. 주제는 바로 “DDR”입니다. DDR은 Dance Dance Revolution의 약자로, 게임에서 플레이어가 음악에 맞춰 스텝을 밟아야 하는 것을 의미합니다. 우리는 이러한 게임의 패턴을 알고리즘 문제로 변환하여 해결해 볼 것입니다.

문제 설명

다음과 같은 문제를 풀어보겠습니다:

문제: DDR 게임에서 플레이어는 각각의 스텝에 대한 시퀀스를 가진다. 이 시퀀스는 오른쪽, 왼쪽, 위, 아래의 방향을 나타낸다. 플레이어에게 주어진 스텝 시퀀스가 유효한지 확인하는 함수를 작성하시오. 유효한 스텝 시퀀스는 반드시 짝수 길이를 가져야 하며, 같은 방향이 연속해서 두 번 이상 나타날 수 없다. 예를 들어:

  • 유효한 시퀀스: “UDLRUDLR”
  • 유효하지 않은 시퀀스: “UUDDLRR”

문제 분석

우선, 문제를 분석해 보겠습니다. 주어진 조건을 충족하는지 확인하기 위해서는 다음과 같은 두 가지 조건을 점검해야 합니다:

  1. 시퀀스의 길이가 짝수이어야 한다.
  2. 같은 방향이 연속하여 두 번 이상 나타나면 안 된다.

여기서 방향은 다음과 같이 매핑할 수 있습니다:

  • U: 위
  • D: 아래
  • L: 왼쪽
  • R: 오른쪽

알고리즘 설계

이제 알고리즘을 설계해 봅시다. 시퀀스가 유효한지 확인하기 위해 아래와 같은 단계를 거칠 것입니다:

  1. 입력된 시퀀스의 길이를 확인한다.
  2. 시퀀스의 각 문자에 대해 반복을 한다. 이때 이전 문자를 기억하여 현재 문자와 비교한다.
  3. 조건을 만족하지 않는 경우, False를 반환하고, 모든 조건을 만족하면 True를 반환한다.

코드 작성

이제 파이썬으로 코드를 작성해 보겠습니다. 아래는 우리가 설계한 알고리즘을 토대로 한 구현입니다:

def is_valid_ddr_sequence(sequence):
    # 1. 시퀀스의 길이가 짝수인지 확인
    if len(sequence) % 2 != 0:
        return False
    
    # 2. 연속된 방향 확인을 위한 이전 문자 저장
    previous = ''
    
    for direction in sequence:
        # 3. 현재 방향이 이전 방향과 같을 경우 False
        if direction == previous:
            return False
        previous = direction  # 이전 방향 업데이트
    
    return True  # 모든 조건을 만족하는 경우 True 반환

테스트 케이스

위에 작성한 함수를 다양한 테스트 케이스로 검증해 보겠습니다. 아래는 몇 가지 테스트 케이스입니다:

print(is_valid_ddr_sequence("UDLRUDLR"))  # True
print(is_valid_ddr_sequence("UUDDLRR"))     # False
print(is_valid_ddr_sequence("UU"))          # False
print(is_valid_ddr_sequence("UDLR"))        # True
print(is_valid_ddr_sequence("UDLRRUDL"))    # False

결과 분석

이제 테스트 결과를 분석해 보겠습니다:

  • is_valid_ddr_sequence("UDLRUDLR"): True – 유효한 시퀀스
  • is_valid_ddr_sequence("UUDDLRR"): False – “U”가 두 번 연속
  • is_valid_ddr_sequence("UU"): False – “U”가 두 번 연속
  • is_valid_ddr_sequence("UDLR"): True – 유효한 시퀀스
  • is_valid_ddr_sequence("UDLRRUDL"): False – “R”이 두 번 연속

추가적인 고려 사항

이번 문제를 푸는 과정에서, 시퀀스가 길어질 경우 발생할 수 있는 성능 문제를 고려해야 합니다. 현재 알고리즘은 O(n)의 시간 복잡도를 가지고 있으므로, 충분한 효율성을 제공합니다. 단, 문자 수가 급격히 증가할 경우, 최적화를 고려하여 더 나은 구조를 설계할 수 있습니다.

결론

이번 포스팅에서는 DDR 게임을 주제로 한 알고리즘 문제를 다뤄보았습니다. 단순한 조건 검사를 통한 알고리즘을 구현하여 유효성을 판별하는 과정은 기초적인 알고리즘 설계에 많은 도움이 될 것입니다. 앞으로도 다양한 문제를 통해 알고리즘적 사고를 키워나가길 바랍니다. 감사합니다!