Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🔗 문제 링크
SWEA 5644 무선 충전(회원가입 필요)
✔️ 소요된 시간
총 2시간...?
✨ 수도 코드
1. 문제 이해
위와 같은 (10 x 10) 크기의 맵에 유저 A는 (1, 1) 위치에서 출발하고, 유저 B는 (10, 10) 위치에서 출발해 매 초마다 북, 동, 남, 서 중 한 방향으로 각각 이동한다. 맵의 곳곳에 배터리 차저(BC)가 존재하는데, 해당 차저의 커버리지(색칠된 영역)에 들어서면 해당 차저의 성능만큼 유저의 스마트폰이 충전된다.
BC 정보와 유저 A, B의 이동 정보가 주어졌을 때 모든 사용자가 충전한 양의 최대값을 구하는 프로그램을 작성해야 한다.
입력은 다음과 같이 주어진다.
2. 문제 풀이
친구가 추천해준 시뮬레이션(구현) 문제이다. 문제에서 주어진 정보를 갖고, 차근히 밀어붙여보자.
테스트케이스의 개수를 입력받고, 해당 횟수만큼 Input을 수행한 뒤 Move를 수행해 최대 충전량을 출력한다.
Input 함수를 정의해 데이터들을 입력받는다.
Move에서는 매 시간마다 사용자들의 위치를 옮겨주고, Charge() 함수를 호출한다.
사용자 A, B의 스마트폰을 충전시키는 역할을 하는 Charge 함수이다. Move에서 a의 위치와 b의 위치를 옮겨줬으므로, 해당 위치를 기반으로 충전 정보를 찾아본다.
이 때 얼마나 충전할 수 있는지는 크게 3가지 경우로 볼 수 있다.
3번 케이스를 커버하기 위해 아래와 같은 코드가 존재하는데
맨 위의 예시 그림에서 T=11일 때의 상황을 다시 확인해보자.
최종적으로 가장 많이 충전할 수 있는 충전기 조합을 찾아 해당 충전량 maxCharge를 반환하면, Move 함수에서 반환받아 이를 누적하고, 모든 움직임에 대해 해당 작업을 완료하면 총 최대 충전량을 알 수 있게 되어 main에서 출력할 수 있게 되는 것이다.
3. 전체 코드
📚 새롭게 알게된 내용
최대한 자세히 설명해본다고 설명했는데, 뭔가 말로만 하려니 쉽지 않다. 그림을 첨부하기에도 좀 애매한 내용이라...
저 최대 충전량을 찾는 데 조금 시간을 날렸다. 완전탐색의 경우를 최후로 미루고 다른 방법 찾겠다고 난리를 쳤더니...
게다가 그림 똑바로 안보고 내가 코드 짜는 행(X)-열(Y) 방식이 아닌 행(Y)-열(X) 방식인 걸 뒤늦게 눈치챘다... 이상한 값이 계속 나와서 이거 찾는다고 시간 또 많이 날렸다.