-
https://www.acmicpc.net/problem/19238
19238번: 스타트 택시
첫 줄에 N, M, 그리고 초기 연료의 양이 주어진다. (2 ≤ N ≤ 20, 1 ≤ M ≤ N2, 1 ≤ 초기 연료 ≤ 500,000) 연료는 무한히 많이 담을 수 있기 때문에, 초기 연료의 양을 넘어서 충전될 수도 있다. 다
www.acmicpc.net
https://github.com/JUNGSOONIL/JAVA/blob/main/BAEKJOON%2019238
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
해당 문제는 map의 정보와 택시, 손님의 출발 도착 정보가 주어졌을때
택시가 손님을 다태울수있는지 없는지를 체크해서 결과를 출력하는 문제다.
조건으로는 이동 한칸당 연료 한칸이 소모되는데 연료를 다쓰면 그날 영없은 종료이며
만약 승객을 이동시킨 동시에 연료가 바닥나면 성공이다
최단 경로의 승객이 여러명이면 행 열 번호가 작은 손님을 태운다 즉 왼쪽 젤상단 손님
택시와 승객이 같은 위치면 거리는 0이다.
위의 조건만 잘이용하면 문제를 해결할수있고, bfs를 이용해서 문제를 해결했다.
입력처리를 진행하는데 손님의 출발좌표는 그냥 map에 손님 번호를 카운트로 넣어주었고
도착 정보는 list를 이용해 저장했는데 손님 번호가 2로 시작해서 나중에 리스트에서 가져올떄는
-2한 값으로 가져와야한다.
무한 루프를 돌면서
1. 가장 가까이 있는 손님을 찾는다.
1-1. 최단거리 손님 리스트를 따로 만들어주고, 손님이 있는곳에 오면 이동거리를 비교해 추가한다
1-2. bfs가 다돌고나면 손님 리스트가 비면 손님이 없으니 null을 리턴해준다.
1-3. 손님이 있다면 손님 리스트를 람다식으로 정렬해준뒤 리스트의 젓번째 값을 리턴해줌과 동시에 연료계산을한다.
2. 손님이 없거나, 손님을 찾아는데 연료가 부족하면 멈춘다.
3. 손님을 목적지로 이동시킨다.
3-1. 여기서 손님 번호를 가지고 리스트에서 도착정보 가져오는데 -2한값을 가져온다
3-2. 택시 위치와 손님 도착위치가 같으면 연료 계산을 하는데 0보다 작아지면 false를 리턴한다
3-3. 연료가 충분하면 연료를 충전해주고 손님 시작위치를 삭제 및 손님 도착수를 1증가시키고 true를 반환한다.
4. 손님을 이동시킬수 없거나, 연료가 부족하면 멈춘다. (3의 return 값이 false)
5. 손님이 도착한 수와 처음 손님수와 비교하여 결과를 출력한다.
해당 문제는 문제자체는 쉬웠던거 같은데 조건들을 처리하는부분에서 애를쫌 먹었었다.
처음 테케가 다 맞길래 제출했더니 1%에서 바로 틀렸다는 결과가 나왔었고, 체크해보니
행렬 정렬하는 부분을 따로 해주지 않아서였고, bfs를 이동하는 순서로 충분히 가능하다 생각했으나
이번에는 제출하니 7%에서 틀렸다고 나와 그냥 람다식을 통해 갈수있는 사람리스트를 정렬해주는 방식을 통해
문제를 해결할수있었다.
728x90'알고리즘 > Baekjoon' 카테고리의 다른 글
Baekjoon 1158 요세푸스 문제 파이썬 (0) 2021.11.03 Baekjoon 1110 더하기 사이클 파이썬 (0) 2021.11.03 Baekjoon 9012 괄호 파이썬 (0) 2021.11.03 Baekjoon 5014 스타트링크 JAVA (0) 2021.11.01 Baekjoon 13460 구슬 탈출 2 JAVA (0) 2021.11.01 댓글