일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Unity
- 프로그래머스
- dfs
- 백준 17070번 c++
- 2870번 수학숙제 c++
- 백준 c++ 2870번
- 코딩테스트
- c++
- 2870번
- 2870번 수학숙제
- 백준 1103번
- 코테
- 백준 2870번
- 백준 1103번 게임
- 수학숙제
- 2870번 c++
- 유니티
- 플레이어 이동
- Algorithm
- 백준 1103번 c++
- 백준
- Lv2
- 백준 17070번
- 오브젝트 풀링
- Beakjoon
- 17070번
- 백준 c++ 2468번
- C#
- 2468 c++
- Lv.3
- Today
- Total
주녘공부일지
[프로그래머스 C#] Lv.2 배달 본문
https://school.programmers.co.kr/learn/courses/30/lessons/12978
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 정답코드 및 핵심 아이디어, 유의사항
- 정점 (마을)
- 간선 (마을 간 이동가능 여부)
- 가중치 (간선을 지나가는 데 필요한 이동시간)
1번 정점과 특정 거리 이상 떨어져있지 않은 정점의 개수를 구하는 문제 (다익스트라 알고리즘)
- 1번 정점과의 거리를 나타내는 1차원 배열을 선언 ( int[] intArray ) // 최단거리배열
- 최초에 탐색 없이 알 수 있는 정보인 1번 정점부터 탐색을 시작
- 1번 정점과 이어진 간선을 찾아서 최단거리배열 최소 값을 확인해 갱신
- 갱신된 정점은 다음 탐색 대상으로 지정하여 탐색 대상이 없을 때까지 순회
Breadth First Search
다익스트라 알고리즘
- Dynamic Programming (DP) 과 Breadth First Search (BFS) 를 활용한 알고리즘
https://godgjwnsgur7.tistory.com/109
[Algorithm C#] 동적 계획법(DP) / Memoization, Tabulation
1. 동적 계획법(DP : Dynamic Programming) 복잡한 하나의 큰 문제를 여러 개의 작은 문제로 나누어 해결하는 문제해결 방법 중 하나 - 작은 문제의 연산 결과를 저장해놓았다가 다시 큰 문제를 해결할
godgjwnsgur7.tistory.com
주석 참조
using System;
using System.Collections.Generic;
class Solution
{
public int solution(int N, int[,] road, int K)
{
int answer = 0;
var intArray = new int[N + 1]; // 최단거리(최단시간)배열
var queue = new Queue<int>(); // 탐색대상 큐
// 초기 값 세팅
for (int i = 0; i < intArray.Length; i++)
intArray[i] = K + 1; // K보다 큰 수는 의미가 없으므로
intArray[1] = 0; // 자기자신과의 거리는 0
queue.Enqueue(1); // 유일하게 알고 있는 정점부터 탐색
// 갱신 대상이 없을 때까지 순회
while (queue.Count > 0)
{
int n = queue.Dequeue(); // 갱신 대상 마을 번호
// 갱신 대상과 연결된 간선을 탐색 (탐색 마을번호 i)
for (int i = 0; i < road.GetLength(0); i++)
{
int n1 = road[i, 0]; // 1번 마을 번호
int n2 = road[i, 1]; // 2번 마을 번호
int dir = road[i, 2]; // 1번 마을 <-> 2번 마을
// 연결된 간선을 찾았다면 최소 값인지 체크해서 갱신
if (n == n1 && intArray[n2] > dir + intArray[n1])
{
intArray[n2] = dir + intArray[n1];
queue.Enqueue(n2); // 갱신되었으므로 탐색 대상
}
else if (n == n2 && intArray[n1] > dir + intArray[n2])
{
intArray[n1] = dir + intArray[n2];
queue.Enqueue(n1); // 갱신되었으므로 탐색 대상
}
}
}
foreach (int num in intArray)
if (num <= K)
answer++;
return answer;
}
}
'CodingTest > Programmers Lv.2' 카테고리의 다른 글
[프로그래머스 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 |
[프로그래머스 C#] Lv.2 의상 (1) | 2023.12.11 |