정말 오랜만에 포스팅합니다. 그동안 일하느라 바쁘기도 했고, 알고리즘 공부도, CS 공부도 조금 소홀하긴 했습니다. 아무튼 오늘 풀어본 문제는 프로그래머스의 요격시스템이라는 문제입니다. 이 문제는 파이썬으로 해결하였습니다. 참고로 코드만 올려놓으면 가끔씩 제가 푼 문제를 제가 봐도 이해가 안 되는 경우가 있어서, 쉽게 설명을 해볼까 합니다.
참고로 해당 문제는 문제 바로가기 링크를 눌러서 확인하실 수 있습니다.
문제 설명
위 사진은 해설을 쉽게 이해하기 위해서 캡쳐해온 문제 설명입니다. 자세한 내용은 프로그래머스 홈페이지에서 확인해 보시기 바랍니다. 아래 사진은 제한사항과 입출력 예입니다.
문제 해결 아이디어
링크에서 입출력 예에 있는 사진을 보고 아이디어를 얻었습니다. 입출력 예 설명의 사진을 보면 1번과 5번 근처와 11번과 12번 사이에서 한번 더 발사해서 총 3번 발사했습니다. 4에서 발사를 하면 총 4개의 미사일을 한 번에 요격할 수 있을 것 같은데, 굳이 1.5번(?)과 4.5번(?)에서 발사한 데는 이유가 있겠죠. 제가 여기서 얻은 아이디어는 마지막 부분이 4일 때, 4에서 발사하면 요격하지 못한다는 것입니다.
즉, target = [s, e]일 때, e에서는 요격이 불가능하니, s <= target < e라고 생각할 수 있습니다. 그렇다면, e를 기준으로 오름차순 정렬을 한 이후, 다음 요소의 s가 현재 요소의 e보다 같거나 크면 미사일을 하나 추가해야 하는 것이고, 다음 요소의 s가 현재 요소의 e보다 작으면 한 개의 미사일로 두 개의 타깃을 모두 요격시킬 수 있는 것이죠.
위의 아이디어를 문제 예시를 통해 시뮬레이션 해보도록 하겠습니다. 먼저 문제에서 targets를 e를 기준으로 오름차순 정렬을 진행하면 아래와 같이 정렬됩니다.
1: [1, 4]
2: [4. 5]
3: [3, 7]
4: [4, 8]
5: [5, 12]
6: [11, 13]
7: [10, 14]
3에서 요격미사일을 발사하면 1번과 7번을 요격시킬 수 있습니다. 그럼 남는 미사일은 아래와 같습니다.
2: [4. 5]
4: [4, 8]
5: [5, 12]
6: [11, 13]
7: [10, 14]
4에서 미사일을 발사하면 남는 미사일은 다음과 같습니다.
5: [5, 12]
6: [11, 13]
7: [10, 14]
그리고 마지막으로 11에서 미사일을 발사하면, 모든 미사일이 요격되는 것입니다. 이걸 파이썬으로 코딩해 보도록 하겠습니다.
파이썬 코딩
def solution(targets):
answer, end = 0, 0
for s, e in sorted(targets, key = lambda x : x[1]):
if s >= end:
end = e
answer += 1
return answer
코드 설명
2번째 요소를 기준으로 정렬된 targets를 기준으로 for문을 돌립니다. 문제 해결 아이디어처럼 다음 요소의 s가 e보다 크거나 같으면, 미사일을 하나 더 발사합니다. 그런데 여기서 end라는 변수를 하나 더 놓은 이유는 요격미사일 한 번 발사로 여러 개의 미사일을 요격하기 때문입니다. 즉, 다음 요소들의 s가 end보다 작은 미사일들은 모두 요격되기 때문에, 요격되지 않은 미사일 중 첫 번째 미사일의 e가 end 되는 것입니다.
마치며
코드자체는 굉장히 쉬운편에 속하지만 설명이 이해되지 않으실 수도 있다고 생각합니다. 그래도 최대한 쉽게 설명한다고 설명했는데, 이해가 되셨으면 좋겠습니다.
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스 LV2] 연속된 부분 수열의 합 (0) | 2023.05.07 |
---|---|
[프로그래머스 LV2] 두 원 사이의 정수쌍 (0) | 2023.04.30 |
[이코테 - DFS/BFS] 미로탈출 (1) | 2022.10.11 |
[이코테 - DFS/BFS] 음료수 얼려먹기 (0) | 2022.10.10 |
[이코테 - 구현] 게임 개발 (0) | 2022.10.09 |
댓글