Algorithm/Baekjoon

[Python] 3048. 개미

느낌표 공장장 2022. 9. 18. 03:13

문제

https://www.acmicpc.net/problem/3048

 

3048번: 개미

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

www.acmicpc.net

 


풀이 과정

딕셔너리로 풀까, 한 칸씩 이동하도록 할까 등 여러 가지 방식을 고민하다가 0으로 채워진 리스트에 개미들을 넣는 방식으로 풀었다.
그래서 개미들을 각 자리에 맞게 넣어주도록 계산하는 것이 중요했다. 

  1. 개미들이 들어갈 리스트를 만들어준다. 이때, 각 그룹마다 개미들을 두 칸씩 띄워 넣어줄 것이기 때문에 넉넉한 크기로 만들어준다. 
  2. 첫 번째 그룹 개미들을 넣는데, 시간(t) 자리부터 넣어준다. (t * 2 ~ t * 2 + n1 * 2)
    (두 칸씩 띄워 넣어 줄 것이기 때문에 지난 시간도 두배, 범위도 n1 길이의 두배로 설정)
    * 그리고 첫 번째 그룹 개미들은 반대 방향으로 이동하고 있으므로 뒤집어서 넣어준다. 
  3. 두 번째 그룹 개미들도 첫 번째 그룹처럼 두 칸씩 띄워 넣는데, 첫 번째 그룹의 교차로 넣어준다. 
    그리고 첫 번째 그룹 개미의 마지막 자리 - 시간(t*2) 자리부터 넣어준다. 
    (첫 번째 그룹의 마지막자리에서 시간만큼 두 번째 그룹을 왼쪽으로 이동해서 넣는다.)
  4. 리스트에 있는 개미들을 문자열로 이어준다. 

 


코드

# 입력 받기
n1, n2 = map(int, input().split())
tmp_ants1 = input()
tmp_ants2 = input()
t = int(input())
# 첫 번째 그룹 개미가 두 번째 그룹 개미 다 뛰어넘은 경우
if n1 + n2 - 1 <= t:
print(tmp_ants2 + ''.join(reversed(tmp_ants1)))
exit()
# 개미들 넣을 리스트 만들어주기
# 두칸씩 띄워 넣을 것이기 때문에 넉넉하게 만들기
sum_ants = [0 for _ in range((n1 + n2) * 3)]
tt = t*2
# 첫 번째 그룹 개미들 넣기
idx = n1 - 1 # 반대 방향이므로 뒤집어서 넣기
for i in range(tt, tt + n1*2, 2):
sum_ants[i] = tmp_ants1[idx]
idx -= 1
# 두 번째 그룹 개미들 넣기
idx = 0
for j in range(i - tt, i - tt + n2*2, 2):
sum_ants[j+1] = tmp_ants2[idx]
idx += 1
# 개미들 이어주기
answer = ''
for ant in sum_ants:
if ant:
answer += ant
print(answer)

'Algorithm > Baekjoon' 카테고리의 다른 글

[Python] 17609. 회문  (1) 2022.09.22
[Python] 24553. 팰린드롬 게임  (0) 2022.09.19
[Python] 20057. 마법사 상어와 토네이도  (0) 2022.09.15
[Python] 2211.네트워크 복구  (2) 2022.08.24
[Python] 9935. 문자열 폭발  (0) 2022.01.17