새소식

Algorithm/코딩테스트

[백준 3048] 개미

  • -

문제

 


문제풀이

개미들을 하나의 리스트에서 ‘튜플’로 관리했다.

  • tuple[1]원소가 1인 경우 : left→right 으로 이동하는 개미
    • 오른쪽으로 이동하는 개미(ants[i][1])의 경우, 내 오른쪽 ants[i+1][1] 이 나랑 같이 ‘1’인지 확인한다.
    • 만약, 내 오른쪽 개미가 0에 해당된다면, 다른 방향의 개미이므로 (i,i+1) 를 change_set에 저장
  • tuple[1]원소가 0인 경우 : right→left으로 이동하는 개미
    • 왼쪽으로 이동하는 개미(ants[i][1])의 경우, 내 왼쪽 ants[i-1][1] 이 나랑 같이 ‘0’인지 확인한다.
    • 만약, 내 오른쪽 개미가 1에 해당된다면, 다른 방향의 개미이므로 (i-1,i) 를 change리스트에 저장
  • change_set
    • 배열이 아니라 set()으로 관리해서 ,바뀔 좌표의 중복을 차단했다. (왼→오 로 탐색하는 경우와 오→왼 으로 탐색하는 경우 모두에서 중복 허용해서 넣어준다면, 제자리로 돌아오는 불상사 발생하기 때문에)

시도1 - 런타임 에러

n1,n2 = map(int,input().split())
left = input()
left = left[::-1]
right = input()
T =int(input())
ants = []

for i in range(n1):
    ants.append((left[i],0))
for i in range(n2):
    ants.append((right[i],1))

for time in range(T):
    change_set = set()
    for i,tup in enumerate(ants):
        if tup[1] == 1: #왼쪽으로 이동하는 개미들
            if ants[i-1][1] != 1:
                change_set.add((i-1,i))
            else:
                continue
        elif tup[1] == 0: #오른쪽으로 이동하는 개미들
            if ants[i+1][1] != 0:
                change_set.add((i,i+1))
            else:
                continue
    for i,j in change_set:
        ants[i],ants[j] = ants[j],ants[i]

result =[tup[0] for tup in ants]
print(''.join(result))

 

런타임에러 발생한 이유는 다음과 같다

  1. 인덱스 범위 초과: 코드가 리스트 ants의 인덱스를 접근할 때 범위를 벗어날 수 있음.
  2. 특히i+1이나 i-1 접근 시 리스트의 경계를 넘는 경우 런타임 에러가 발생
  3. T = 0일 때 예외 처리 없음: T가 0일 때 예외처리 생략 ( 문제 조건에 T=0인 경우도 포함)
  4. 개미가 리스트의 양 끝에 있는 경우 처리 필요: i가 0이거나 i가 리스트의 마지막 인덱스일 때, i-1이나 i+1 접근 시 문제가 생긴다

리스트 인덱스로 접근할 때, 큰 맥락에서 범위 벗어지 않도록 처리하는거 계속 까먹는데, 앞으로 더 주의하자

  • 왼→오로 갈 때, 전체 리스트 범위 초과하지 않는지
  • 오 → 왼으로 갈 때, 0보다 작아지지 않는지

시도2) 성공

n1,n2 = map(int,input().split())
left = input()
left = left[::-1]
right = input()
T =int(input())
ants = [] 

for i in range(n1):
    ants.append((left[i],0))
for i in range(n2):
    ants.append((right[i],1))

if T == 0:
    result =[tup[0] for tup in ants]
    print(''.join(result))
else:
    for time in range(T):
        change_lst = set()
        for i,tup in enumerate(ants):
            if tup[1] == 1: #왼쪽으로 이동하는 개미들
                if i > 0  and ants[i-1][1] != 1:
                    change_lst.add((i-1,i))
                else:
                    continue
            elif tup[1] == 0: #오른쪽으로 이동하는 개미들
                if i < len(ants) - 1 and ants[i+1][1] != 0:
                    change_lst.add((i,i+1))
                else:
                    continue
        for i,j in change_lst:
            ants[i],ants[j] = ants[j],ants[i]

    result =[tup[0] for tup in ants]
    print(''.join(result))

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.