Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 백준 1103번 c++
- 2870번
- 2870번 수학숙제
- 코테
- dfs
- Beakjoon
- 백준 1103번 게임
- Lv2
- Unity
- 2870번 수학숙제 c++
- Lv.3
- Algorithm
- 프로그래머스
- 백준 17070번
- 플레이어 이동
- 백준 17070번 c++
- 2468 c++
- C#
- 유니티
- 백준 1103번
- 17070번
- 2870번 c++
- c++
- 백준 c++ 2870번
- 백준 c++ 2468번
- 백준 2870번
- 수학숙제
- 오브젝트 풀링
- 백준
- 코딩테스트
Archives
- Today
- Total
주녘공부일지
[프로그래머스 C#] Lv.2 택배 배달과 수거하기 본문
https://school.programmers.co.kr/learn/courses/30/lessons/150369
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 정답코드 및 핵심 아이디어, 유의사항
물류창고 -> 배달 -> 수거 -> 물류창고를 반복해 배달, 수거를 끝내는 최단 거리를 구하는 문제
- 배달이든, 수거든 최단거리로 이동하기 위해선 가장 멀리있는 곳을 먼저 가야 함 ( 동일 조건 )
- 배달과 수거는 동시에 이루어질 수 있기 때문에, 더 멀리 있는 곳을 기준으로 이동하면 됨
-> 즉, 배달배열과 수거배열 중에 더 멀리 가야하는 곳을 기준으로 삼아 이동횟수 * 2
+ 0번 인덱스의 집에 가는 거리는 1이므로, 인덱스의 길이가 가장 먼 인덱스와의 거리가 됨
1) 끝을 지워나가며 체크하기 위해 리스트에 담음
- 리스트의 길이가 배달을 해야하는 거리가 됨
2) 두 리스트에 대해 같은 동작을 할 것이기 때문에 메서드를 따로 선언 ( Function )
- 리스트의 마지막 인덱스가 0이 아닐때까지 끝을 지워나감
- 리스트의 마지막 인덱스부터 0이 될때까지 빼나감 ( cap 값 만큼 )
3) 한 사이클의 왕복 거리 측정 ( 한 사이클 : 물류창고 -> 배달 -> 수거 -> 물류창고 )
- 함수에서는 배달, 수거를 하기 전에 마지막 인덱스를 지우기 때문에 list의 길이는 배달을 해야하는 거리가 됨
주석 참조
using System;
using System.Collections.Generic;
public class Solution
{
public long solution(int cap, int n, int[] deliveries, int[] pickups)
{
long answer = 0;
// 1) 끝을 지워나가며 체크하기 위해 리스트에 담음
var list1 = new List<int>(deliveries);
var list2 = new List<int>(pickups);
while(list1.Count > 0 || list2.Count > 0)
{
// 2) 택배상자를 배달, 수거
if(list1.Count > 0) Function(list1, cap);
if(list2.Count > 0) Function(list2, cap);
// 3) 왕복거리 측정
int moveDir = (list1.Count > list2.Count) ? list1.Count : list2.Count;
answer += (long)moveDir * 2; // 이동거리
}
return answer;
}
// 택배를 배달하거나 수거하는 메서드
public void Function(List<int> list, int cap)
{
// 1. 리스트의 마지막 인덱스가 0이 아닐 때까지 지움
while(list.Count > 0 && list[list.Count - 1] == 0)
list.RemoveAt(list.Count - 1);
int currIndex = list.Count - 1;
// 2. 택배 상자를 배달하거나 수거
while(currIndex >= 0 && cap > 0)
{
if(list[currIndex] > 0)
{
list[currIndex]--;
cap--;
}
else
currIndex--;
}
}
}
'CodingTest > Programmers Lv.2' 카테고리의 다른 글
[프로그래머스 C#] Lv.2 광물 캐기 (0) | 2023.12.29 |
---|---|
[프로그래머스 C#] Lv.2 미로 탈출 (1) | 2023.12.27 |
[프로그래머스 C#] Lv.2 배달 (0) | 2023.12.25 |
[프로그래머스 C#] Lv.2 멀리 뛰기 (0) | 2023.12.12 |
[프로그래머스 C#] Lv.2 프로세스 (0) | 2023.12.11 |