250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
Tags
- 부스트코스
- 주엽역 생활맥주
- 막내의막무가내 플러터
- 프로그래머스 알고리즘
- Fragment
- 막내의막무가내 프로그래밍
- 2022년 6월 일상
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내
- 주택가 잠실새내
- 막내의막무가내 rxjava
- flutter network call
- 막무가내
- 막내의막무가내 안드로이드
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 SQL
- 막내의막무가내 알고리즘
- 안드로이드
- 부스트코스에이스
- 안드로이드 Sunflower 스터디
- 막내의막무가내 목표 및 회고
- 막내의막무가내 코틀린
- 막내의 막무가내 알고리즘
- 막내의막무가내 안드로이드 코틀린
- 막내의 막무가내
- 프래그먼트
- 막내의막무가내 일상
- 안드로이드 sunflower
- 막내의막무가내 플러터 flutter
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[알고리즘] 백준 1405 미친 로봇 -DFS, 완전탐색- 자바 코틀린 본문
728x90
https://www.acmicpc.net/problem/1405
백준 완전탐색 유형에서 미친 로봇이라는 문제를 풀어보았습니다. ㅎㅎ
동서남북으로 움직일 수 있는 로봇이 N만큼 이동을 하는데 로봇이 같은 곳을 한 번보다 많이 움직이지 않을 때 이동경로가 단순한 로봇이고 이러한 움직임을 가질 확률을 구하는 문제였습니다. 추가로 동서남북 이동확률이 존재합니다.
그래서 풀이방법은 움직임과 해당 경로까지 움직임의 확률을 DFS로 넘기면서 탐색해주면 되는 문제였습니다.
주석으로 풀이를 적어놨습니다.
풀이는 다음과 같습니다.
[Java]
import java.util.Scanner;
class Main {
private static int N; // 로봇 움직일 횟수
private static double[] directions = new double[4]; // 각 방향의 이동확률 (동서남북순)
private static int[] dr = {1, -1, 0, 0}; // 동서남북순으로 directions 와 맞춰준다. 안그럼 틀림
private static int[] dc = {0, 0, 1, -1};
private static boolean[][] isVisited = new boolean[100][100];
private static double answer = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
for (int i = 0; i < 4; i++) { // 각 방향 이동 확률 초기화 (이동할 확률을 모두 더하면 100이다.)
directions[i] = 0.01 * sc.nextInt();
}
isVisited[50][50] = true;
dfs(50, 50, 1.0);
System.out.println(answer);
}
private static void dfs(int r, int c, double p) {
if (N == 0) { // 다움직임
answer += p; // 로빗의 이동경로 단순할 확률업
return;
}
for (int i = 0; i < 4; i++) {
int r2 = r + dr[i];
int c2 = c + dc[i];
if (!isVisited[r2][c2] && directions[i] > 0) { // 0인 이동확률도 제외해줘야함
N--;
isVisited[r2][c2] = true;
dfs(r2, c2, p * directions[i]); // 이동 , 확률 더해줌
N++;
isVisited[r2][c2] = false;
}
}
}
}
[Kotlin]
import java.util.*
private var N // 로봇 움직일 횟수
= 0
private val directions = DoubleArray(4) // 각 방향의 이동확률 (동서남북순)
private val dr = intArrayOf(1, -1, 0, 0) // 동서남북순으로 directions 와 맞춰준다. 안그럼 틀림
private val dc = intArrayOf(0, 0, 1, -1)
private val isVisited = Array(100) { BooleanArray(100) }
private var answer = 0.0
fun main(args: Array<String>) {
val sc = Scanner(System.`in`)
N = sc.nextInt()
for (i in 0..3) { // 각 방향 이동 확률 초기화 (이동할 확률을 모두 더하면 100이다.)
directions[i] = 0.01 * sc.nextInt()
}
isVisited[50][50] = true
dfs(50, 50, 1.0)
println(answer)
}
private fun dfs(r: Int, c: Int, p: Double) {
if (N == 0) { // 다움직임
answer += p // 로빗의 이동경로 단순할 확률업
return
}
for (i in 0..3) {
val r2 = r + dr[i]
val c2 = c + dc[i]
if (!isVisited[r2][c2] && directions[i] > 0) { // 0인 이동확률도 제외해줘야함
N--
isVisited[r2][c2] = true
dfs(r2, c2, p * directions[i]) // 이동 , 확률 더해줌
N++
isVisited[r2][c2] = false
}
}
}
https://github.com/mtjin/algorithm_practice/commit/150893e838f243c517a6c26f7137827d5f83134c
댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!!
728x90
'알고리즘 > DFS, BFS, 시뮬, 백트래킹' 카테고리의 다른 글
[알고리즘] 백준 15656 N과 M (7) -백트래킹- 자바 (2) | 2021.11.22 |
---|---|
[알고리즘] 프로그래머스 가장 큰 정사각형 찾기 -BFS, DP- 자바 (0) | 2021.08.10 |
[알고리즘] 프로그래머스 거리두기 확인하기 (2021 카카오 채용연계형 인턴십) -BFS- 자바, 코틀린 (0) | 2021.07.25 |
[알고리즘] 프로그래머스 메뉴 리뉴얼 (2021 KAKAO BLIND RECRUITMENT) -DFS- 자바 (2개 시간초과) (2) | 2021.07.06 |
[알고리즘] 프로그래머스 단체사진 찍기 (2017 카카오코드 본선) -DFS- 자바 (3) | 2021.07.06 |
Comments