
TODAY TIL
환규와 태욱이는 문자열을 가지고 재미있는 "탕수육 게임"을 하고 있습니다. 게임의 규칙은 다음과 같습니다:
- 누가 먼저 시작할지 순서를 정합니다.
- 먼저 시작하는 사람이 단어의 첫 글자를 말합니다.
- 이후 두 사람은 번갈아 가며 다음 글자를 순서대로 말합니다.
- 단어의 마지막 글자에 도달하면, 다시 단어의 첫 글자로 돌아가서 반복합니다.
- 잘못된 글자를 말하면 게임에서 지게 됩니다.
예를 들어, 단어가 탕수육이라면:
- 첫 번째 사람: "탕", "육", "수", "탕", "육", "수" ...
- 두 번째 사람: "수", "탕", "육", "수", "탕", "육" ...
코드 소개
탕수육 게임의 규칙을 바탕으로, 두 사람이 번갈아 문자열을 나누어 가져가는 방식을 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)
- 문자열의 길이에 따라 처리 방식이 달라집니다:
- 짝수 길이: 문자열 v 그대로 사용.
- 홀수 길이: 문자열 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
처리 과정
- 첫 번째 게임: "탕수육"
- player1: "탕육수" → 첫 번째 사람이 가져간 문자.
- player2: "수탕육" → 두 번째 사람이 가져간 문자.
- 출력:
탕육수
수탕육
2 .두 번째 게임: "ABC"
- 문자열 길이가 홀수이므로 "ABCABC"로 확장.
- player1: "ACB" → 첫 번째 사람이 가져간 문자.
- player2: "BCA" → 두 번째 사람이 가져간 문자.
- 출력:
ACB
BCA
최종 출력
탕육수
수탕육
ACB
BCA
코드의 한계와 개선 가능성
- 반복 확장 방식의 비효율성
- 홀수 길이 문자열에서 v * 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])
결론
이 코드는 두 사람이 번갈아 문자열을 나누는 방식으로 게임을 진행하도록 구현되었습니다. 이를 통해 문자열의 반복적인 패턴을 쉽게 처리할 수 있습니다. 개선된 코드는 더 효율적으로 처리하며, 결과를 반환해 다양한 방식으로 활용할 수 있습니다.
탕수육 게임처럼 단순하지만 재미있는 문제를 통해 문자열 처리와 반복 구조에 대한 이해를 높여보세요! 😊
'python' 카테고리의 다른 글
99클럽 코테 스터디_4기 34일차 TIL (0) | 2024.12.01 |
---|---|
99클럽 코테 스터디_4기 33일차 TIL (0) | 2024.12.01 |
99클럽 코테 스터디_4기 31일차 TIL (1) | 2024.11.28 |
99클럽 코테 스터디_4기 30일차 TIL (0) | 2024.11.27 |
99클럽 코테 스터디_4기 29일차 TIL (1) | 2024.11.26 |