TODAY TIL

환규와 태욱이는 문자열을 가지고 재미있는 "탕수육 게임"을 하고 있습니다. 게임의 규칙은 다음과 같습니다:

  1. 누가 먼저 시작할지 순서를 정합니다.
  2. 먼저 시작하는 사람이 단어의 첫 글자를 말합니다.
  3. 이후 두 사람은 번갈아 가며 다음 글자를 순서대로 말합니다.
  4. 단어의 마지막 글자에 도달하면, 다시 단어의 첫 글자로 돌아가서 반복합니다.
  5. 잘못된 글자를 말하면 게임에서 지게 됩니다.

예를 들어, 단어가 탕수육이라면:

  • 첫 번째 사람: "탕", "육", "수", "탕", "육", "수" ...
  • 두 번째 사람: "수", "탕", "육", "수", "탕", "육" ...

코드 소개

탕수육 게임의 규칙을 바탕으로, 두 사람이 번갈아 문자열을 나누어 가져가는 방식을 Python 코드로 구현했습니다. 이번 포스팅에서는 이 코드를 분석하며 어떻게 동작하는지 알아보겠습니다.

 

코드

def solution(case):
    answer = 0

    for v in case:
        player1 = []
        player2 = []
        for i, c in enumerate(v if (len(v) % 2) == 0 else v * 2):
            if i % 2 == 0:
                player1.append(c)
            else:
                player2.append(c)
        print("".join(player1))
        print("".join(player2))
    return answer


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

 

코드 분석

1. 함수 정의

def solution(case):
    answer = 0

 

 

  • 함수 solution은 문자열의 리스트 case를 입력으로 받습니다.
  • answer는 반환 값으로 초기화되지만, 현재는 출력 외에 사용되지 않습니다.

2. 게임 데이터 처리

for v in case:
    player1 = []
    player2 = []

 

 

  • 각 문자열 v를 순회하며, 두 사람의 문자 선택을 저장할 리스트 player1과 player2를 초기화합니다.

3. 문자열 순회 및 나누기

for i, c in enumerate(v if (len(v) % 2) == 0 else v * 2):
    if i % 2 == 0:
        player1.append(c)
    else:
        player2.append(c)

 

 

  • 문자열의 길이에 따라 처리 방식이 달라집니다:
    1. 짝수 길이: 문자열 v 그대로 사용.
    2. 홀수 길이: 문자열 v를 두 번 반복한 문자열 v * 2 사용.
      • 이렇게 하면 홀수 길이에서도 두 사람이 계속 번갈아 가며 문자를 가져갈 수 있습니다.
  • enumerate를 사용해 문자열의 각 문자와 해당 인덱스 i를 가져옵니다:
    • i % 2 == 0: 첫 번째 사람이 선택(player1에 추가).
    • i % 2 == 1: 두 번째 사람이 선택(player2에 추가).

4.결과 출력

print("".join(player1))
print("".join(player2))

 

 

 

  • 두 사람의 선택 결과를 각각 출력합니다.
  • player1과 player2 리스트의 문자를 합쳐 문자열로 변환한 뒤 출력합니다.

5.입력 및 함수 호출

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

 

 

  • 입력 데이터:
    • 첫 번째 줄: 게임의 수 n.
    • 이후 n개의 문자열이 게임의 데이터로 입력됩니다.
  • solution 함수에 입력 데이터를 전달하여 결과를 처리합니다.

동작 예시

입력

2
탕수육
ABC

 

처리 과정

  1. 첫 번째 게임: "탕수육"
    • player1: "탕육수" → 첫 번째 사람이 가져간 문자.
    • player2: "수탕육" → 두 번째 사람이 가져간 문자.
    • 출력:
       
탕육수
수탕육

 

2 .두 번째 게임: "ABC"

  • 문자열 길이가 홀수이므로 "ABCABC"로 확장.
  • player1: "ACB" → 첫 번째 사람이 가져간 문자.
  • player2: "BCA" → 두 번째 사람이 가져간 문자.
  • 출력:
     
ACB
BCA

 

최종 출력

탕육수
수탕육
ACB
BCA

 

코드의 한계와 개선 가능성

  1. 반복 확장 방식의 비효율성
    • 홀수 길이 문자열에서 v * 2로 확장하면 메모리를 낭비할 수 있습니다.
    • 이를 대신해 인덱스를 순환적으로 접근하면 더 효율적입니다.
  2. 리턴 값 사용
    • 현재 코드는 결과를 출력만 하고 반환하지 않습니다. 결과를 리스트로 반환하면 더 유연하게 활용할 수 있습니다.

개선된 코드

def solution(case):
    results = []
    for v in case:
        player1 = []
        player2 = []
        n = len(v)
        for i in range(n):
            if i % 2 == 0:
                player1.append(v[i % n])
            else:
                player2.append(v[i % n])
        results.append(("".join(player1), "".join(player2)))
    return results

# 입력 처리
n = int(input())
games = [input() for _ in range(n)]
result = solution(games)

# 결과 출력
for r in result:
    print(r[0])
    print(r[1])

 

결론

이 코드는 두 사람이 번갈아 문자열을 나누는 방식으로 게임을 진행하도록 구현되었습니다. 이를 통해 문자열의 반복적인 패턴을 쉽게 처리할 수 있습니다. 개선된 코드는 더 효율적으로 처리하며, 결과를 반환해 다양한 방식으로 활용할 수 있습니다.

탕수육 게임처럼 단순하지만 재미있는 문제를 통해 문자열 처리와 반복 구조에 대한 이해를 높여보세요! 😊

+ Recent posts