Skip to content

[이준희-9주차 알고리즘 스터디] #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 16 commits into
base: junhee325/week9
Choose a base branch
from

Conversation

JHLEE325
Copy link
Contributor

🚀 싸피 15반 알고리즘 스터디 9주차 [이준희]

📌 문제 풀이 개요

  • 이번 PR에서는 다음 5문제의 풀이를 포함합니다.
  • 각 문제에 대한 풀이 과정과 접근 방식을 설명합니다.

✅ 문제 해결 여부

  • 문제 1
  • 문제 2
  • 문제 3
  • 문제 4
  • 문제 5

💡 풀이 방법

문제 1: 유기농 배추

문제 난이도
실버 2

문제 유형
그래프

접근 방식 및 풀이
배추가 심어져 있는 구역의 갯수를 구하는 문제였습니다.
bfs를 활용하여 풀었습니다.

public static void find(int y, int x) {
		if (chk[y][x] || map[y][x] != 1) { // 이미 체크 했거나 배추가 아니면
			return;
		} else {
			for (int i = 0; i < 4; i++) { // 상하좌우 탐색
				int dy = y + dir[i][0];
				int dx = x + dir[i][1];

				if (dy < 0 || dy >= N || dx < 0 || dx >= M) {
					continue;
				} else {
					chk[y][x] = true;
					temp = true;
					find(dy, dx);
				}
			}
		}
		return;
	}

문제 2: DFS와 BFS

문제 난이도
실버 2

문제 유형
그래프

접근 방식 및 풀이
노드와 간선의 정보를 이용하여 DFS와 BFS로 탐색하는 문제였습니다.
n이 크지 않아 인접행렬을 이용하여 문제를 풀었습니다.

static void dfs(int start) { // dfs

		visited[start] = true;
		System.out.print(start + " ");

		for (int i = 1; i <= n; i++) {
			if (arr[start][i] == 1 && !visited[i]) {
				dfs(i);
			}
		}

	}

	static void bfs(int start) { // bfs

		Queue<Integer> list = new ArrayDeque<>();
		list.add(start);
		visited[start] = true;

		while (list.size() != 0) {
			int idx = list.poll();
			System.out.print(idx + " ");
			for (int i = 1; i <= n; i++) {
				if (arr[idx][i] == 1 && !visited[i]) {
					visited[i] = true;
					list.add(i);
				}
			}
		}

	}

문제 3: 숨바꼭질

문제 난이도
실버 1

문제 유형
그래프

접근 방식 및 풀이
0 ~ 100000 좌표 내에서 특정 위치에서 출발하여 도착지까지 걸리는 시간을 구하는 문제였습니다.
bfs를 이용하고 각 시간별로 bfs를 시행하여 각 좌표에 도착하는 시간을 기록한 후
최종적으로 그 좌표의 시간을 출력하였습니다.

public static void bfs(int start) {
		Queue<Integer> list = new ArrayDeque<>();
		visited[start] = true;
		list.offer(start);

		while (!list.isEmpty()) {
			int n = list.size(); // 같은 시간에 확인해야 하는 위치 수수
			for(int k=0;k<n;k++) {
				int cur = list.poll();
				line[cur]=count;
				if (cur == K)
					return;
				for (int i = 0; i < 3; i++) {
					int dx = cur;
					if (i == 0) { // 한 칸 앞으로
						dx += 1;
					} else if (i == 1) { // 한 칸 뒤로
						dx -= 1;
					} else { // 현재 좌표에서 2배로로
						dx *= 2;
					}
					if(dx>=0&&dx<100001&&!visited[dx]) { // 조건에 맞으면 큐에 추가가
						list.offer(dx);
						visited[dx]=true;
					}
				}
			}
			count++; // 1초 추가
		}
	}

문제 4: 적록색약

문제 난이도
골드 4

문제 유형
그래프

접근 방식 및 풀이
Red, Green, Blue로 이루어진 행렬에서 적록색약과 일반인이 보는 구역의 수를 각각 출력하는 문제였습니다.
적록색약과 일반인의 각각의 행렬과 각각의 bfs를 구현하여 풀었습니다.

for (int i = 0; i < n; i++) { // 편의를 위해 각 문자를 숫자로 변환하여 입력
			String str = br.readLine();
			for (int j = 0; j < n; j++) {
				char c = str.charAt(j);
				if (c == 'R') {
					arr[i][j] = 1;
					arr2[i][j]=1;
				} else if (c == 'G') { // 적록색맹은 R과 G일때 모두 1
					arr[i][j] = 2;
					arr2[i][j]=1;
				} else if (c == 'B') {
					arr[i][j] = 3;
					arr2[i][j]=3;
				}
			}
		}

문제 5: 플로이드

문제 난이도
골드 4

문제 유형
다익스트

접근 방식 및 풀이
도시들과 그 도시들을 이동하는 버스의 가격을 입력받아 모든 위치에서 다른 모든위치로의 모든 가격을 파악하는 문제였습니다.
플로이드 워셜 알고리즘을 사용하는 문제였습니다.

for (int k = 1; k <= n; k++) { // 플로이드 워셜 알고리즘 사용하여 비용 계산
			for (int i = 1; i <= n; i++) {
				for (int j = 1; j <= n; j++) {
					arr[i][j] = Math.min(arr[i][j], arr[i][k] + arr[k][j]);
				}
			}
		}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant