99클럽 코테 스터디 24일차 TIL + 배열, reversed()

임정민·2025년 2월 24일
0
post-thumbnail

1. 문제

[문제 설명]

개미가 일렬로 이동할 때, 가장 앞의 개미를 제외한 나머지 개미는 모두 앞에 개미가 한 마리씩 있다.

서로 반대 방향으로 이동하던 두 개미 그룹이 좁은 길에서 만났을 때, 개미는 어떻게 지나갈까?

최근 연구에 의하면 위와 같은 상황이 벌어지면 개미는 서로를 점프해서 넘어간다고 한다.

즉, 두 그룹이 만났을 때, 1초에 한번씩 개미는 서로를 뛰어 넘는다. (한 개미가 다른 개미를 뛰어 넘고, 다른 개미는 그냥 전진한다고 생각해도 된다)

하지만 모든 개미가 점프를 하는 것은 아니다. 자신의 앞에 반대 방향으로 움직이던 개미가 있는 경우에만 점프를 하게 된다.

첫 번째 그룹이 ABC로 움직이고, 두 번째 그룹의 개미가 DEF순으로 움직인다고 하자. 그럼, 좁은 길에서 만났을 때, 개미의 순서는 CBADEF가 된다. 1초가 지났을 때는 자신의 앞에 반대방향으로 움직이는 개미가 있는 개미는 A와 D다. 따라서, 개미의 순서는 CBDAEF가 된다. 2초가 되었을 때, 자신의 앞에 반대 방향으로 움직이는 개미는 B,D,A,E가 있다. 따라서, 개미의 순서는 CDBEAF가 된다.

T초가 지난 후에 개미의 순서를 구하는 프로그램을 작성하시오.

[입력]

첫 번째 줄에 첫 번째 그룹의 개미의 수 N1과 두 번째 그룹의 개미의 수 N2가 주어진다.

다음 두 개 줄에는 첫 번째 그룹과 두 번째 그룹의 개미의 순서가 주어진다. 각 개미는 알파벳 대문자로 표현할 수 있으며, 두 그룹에서 중복되는 알파벳은 없다.

마지막 줄에는 T가 주어진다. (0 ≤ T ≤ 50)

[출력]

T초가 지난 후에 개미의 순서를 출력한다. 첫 번째 개미 그룹은 왼쪽에서 오른쪽으로 움직이고, 두 번째 그룹은 반대 방향으로 움직인다.

[입출력 예]

2. 풀이

import sys

# 입력 받기
N1, N2 = map(int, sys.stdin.readline().split())
N1_list = list(sys.stdin.readline().strip())  
N2_list = list(sys.stdin.readline().strip())  
T = int(sys.stdin.readline().strip())

# 첫 번째 그룹은 왼쪽 → 오른쪽, 두 번째 그룹은 오른쪽 → 왼쪽이므로 뒤집기
ants = list(reversed(N1_list)) + N2_list  # CBADEF 형태로 저장

groups = [1] * N1 + [2] * N2  # 개미 그룹 구분 - [1,1,1,2,2,2] 형태

for _ in range(T):  # T초 동안 반복

    i = 0
    
    while i < len(ants) - 1:  # 리스트의 끝까지 탐색
    
        if groups[i] == 1 and groups[i + 1] == 2:  # 앞 개미가 1번 그룹(→)이고, 뒤 개미가 2번 그룹(←)이면 점프!
            ants[i], ants[i + 1] = ants[i + 1], ants[i]  # 위치 변경 (점프)
            groups[i], groups[i + 1] = groups[i + 1], groups[i]  # 그룹도 변경
            i += 1  # 점프했으니 한 칸 건너뛰기
            
        i += 1  # 다음 개미로 이동

print("".join(ants))

3. 회고

3-1. 문제 해결 과정

문제 이해 자체는 어렵지 않았으나 개미를 어떻게 옮기고 기록할 것인지가 관건이었다. 한 쪽은 반대로 구성되어 있기 때문에 먼저 양쪽 개미들을 모두 같은 방향을 바라보도록 list()를 이용하여 통일했다. 그리고 문자열로 된 개미 집단을 이용해서 계산하기에는 어려울 것 같아 새로운 그룹을 만들어 각 개미 집단에 1과 2라는 숫자를 부여했다.

# 첫 번째 그룹은 왼쪽 → 오른쪽, 두 번째 그룹은 오른쪽 → 왼쪽이므로 뒤집기
ants = list(reversed(N1_list)) + N2_list  # CBADEF 형태로 저장

groups = [1] * N1 + [2] * N2  # 개미 그룹 구분 - [1,1,1,2,2,2] 형태

앞에 있는 개미가 1번 그룹이고 뒤에 있는 개미가 2번 그룹이면 ants 리스트 내 개미들의 위치를 서로 바꾸었다. 그리고 groups의 개미 정보도 업데이트를 하면서 개미가 점프했으니 i를 증가시켰다. 이후 T초 내에서 지속적인 점프를 위해 while 문의 i도 증가시켜 다음 개미를 비교할 수 있도록 했다.

3-2. 새롭게 배운 내용

  • reversed() : 리스트, 문자열 등 반복 가능한 객체를 뒤집어서 반환하는 함수이다. 리스트를 직접 뒤집는 것이 아닌 뒤집힌 객체를 반환하기 떄문에 list()str()로 감싸서 사용해야 한다.
profile
Data Science and Natural Language Processing

0개의 댓글

관련 채용 정보