[Programmers] 양과 늑대 (Java)

2022. 2. 13. 22:11· Algorithm
반응형

- 알고리즘 분류 : DFS (BFS로도 풀이 가능)

- 사용 언어 : JAVA

- 문제 요점

  1. DFS로 계속 깊은 곳을 가는 것이 아닌, 방문 가능한 노드를 다 확인하며 진행한다.
  2. 양보다 늑대의 수가 많거나 작으면 다 잡아 먹힌다. (DFS 탈출)
  3. 노드를 방문할 때마다 양과 늑대의 수를 체크하고 방문을 체크하며 DFS를 진행한다.
  4. 효율성 테스트가 없어 간단하게 작성한 코드입니다. (방문 체크 변수를 ArrayList로 추가하고 방문한 노드들만 추가하는 방향으로 하면 더욱 빠를 것이다.)

 

소스 설명은 주석을 참고해주세요.

import java.util.*;

class Solution {
    // map 변수
    public static ArrayList<ArrayList<Integer>> map = new ArrayList<ArrayList<Integer>>();

    // 양의 수 
    public static int result = 0;

    // 각 노드의 양/늑대 구별 (전역 변수로 사용하고 싶어서 선언)
    public static int[] node;

	// DFS
	// num : 현재 노드 인덱스 
	// sheep : 양의 수
	// wolf : 늑대의 수 
	// list : 방문체크 변수 (true : 방문 O, false : 방문 X)
    public static void DFS(int num, int sheep, int wolf, boolean[] list) {
        // 양이면 양의 수 추가 
        if(node[num] == 0) {
            sheep++;
        }
        
        // 늑대라면 늑대의 수 추가 
        else if(node[num] == 1) {
            wolf++;
        }
        
        // 늑대가 양보다 많거나 같을 경우 종료 
        if(wolf>=sheep) {
            return;
        }

        // 방문체크용 배열을 깊은 복사(주소가 아닌 값 복사)
        boolean[] newList = list.clone();
        newList[num] = true;
        
        // 기록된 양의 최대 수 보다 많을 경우 갱신 
        result = Math.max(result, sheep);

        for(int i=0; i<newList.length; i++) {
            // 방문한 노드에서 갈 수 있는 곳 확인 
            if(newList[i] == true) {
                // 방문한 노드와 인접한 노드 체크 
                for(int j=0; j<map.get(i).size(); j++) {
                    int temp = map.get(i).get(j);

                    // 이미 갔던 곳은 안 가도록(새로운 곳만) 
                    if(newList[temp] == false) {
                        DFS(temp, sheep, wolf, newList);
                    }
                }
            }
        }
    }

    public int solution(int[] info, int[][] edges) {
         
		// 방문 체크용 변수
        boolean[] visited = new boolean[info.length];

        // 전역변수로 사용하기 위해 복사(얕은 복사해도 상관 없음)
        node = info;

        // map 설정
        for(int i=0; i<info.length; i++) {
            map.add(new ArrayList<Integer>());
        }

        // map 설정 ( 한쪽으로만 갈 수 있는 게 아니라 양방향으로 이동 가능하기 때문에 아래와 같이 설정 
        for(int i=0; i<edges.length; i++) {
            map.get(edges[i][0]).add(edges[i][1]);
            map.get(edges[i][1]).add(edges[i][0]);
        }

        // 양의 최대 수 구하기 
        DFS(0,0,0, visited);

        // 양의 최대 수 반환
        return result;
    }
}
반응형

'Algorithm' 카테고리의 다른 글

[BAEKJOON] 2606번 : 바이러스 (JAVA)  (0) 2022.02.16
[BAEKJOON] 1197번 : 최소 스패닝 트리 (JAVA)  (0) 2022.02.15
[Programmers] 무지의 먹방 라이브  (0) 2022.02.13
[BAEKJOON] 1647번 : 도시 분할 계획 (JAVA)  (0) 2022.02.12
[이것이 코딩테스트다] 9. 그래프 - 실전 문제 풀이  (0) 2022.02.12
'Algorithm' 카테고리의 다른 글
  • [BAEKJOON] 2606번 : 바이러스 (JAVA)
  • [BAEKJOON] 1197번 : 최소 스패닝 트리 (JAVA)
  • [Programmers] 무지의 먹방 라이브
  • [BAEKJOON] 1647번 : 도시 분할 계획 (JAVA)
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514) N
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195) N
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • 자바 공부
  • MongoDB 기초부터 실무까지
  • 자기 개발
  • 알고리즘공부
  • Java to Kotlin
  • 자기개발
  • 이펙티브 자바
  • Oracle
  • 프로젝트로 배우는 Vue.js 3
  • 이펙티브자바
  • MongoDB 공부
  • Effective Java
  • 자기공부
  • JPA
  • 알고리즘 공부
  • junit5
  • 전산회계 2급 준비
  • vue3 공부
  • 자바 개발자를 위한 코틀린 입문
  • 자바공부
  • 자바 테스팅 프레임워크
  • 더 자바 Java 8
  • MongoDB with Node.js
  • 코테공부
  • 코테 공부
  • 자기 공부
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • java 8
  • JPA 공부
  • 코틀린

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Programmers] 양과 늑대 (Java)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.