[프로그래머스] 양과 늑대 - Java

2022. 5. 9. 19:12· Algorithm/프로그래머스 문제풀이

 

 

 

문제출저 : 

https://programmers.co.kr/learn/courses/30/lessons/92343

 

코딩테스트 연습 - 양과 늑대

[0,0,1,1,1,0,1,0,1,0,1,1] [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]] 5 [0,1,0,1,1,0,1,0,0,1,0] [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[3,7],[4,8],[6,9],[9,10]] 5

programmers.co.kr

 

 

소스코드 : 

package studyGroup.april.april25;

/*

늑대가 양과 같거나 많으면 양을 잡아먹는다.
최대한 많은 수의 양을 모으자.

info : 노드의 정보(양인지 늑대인지)
edge : 노드의 연결

양을 먹을 때마다 지난 온 노드들을 전부 확인해야 한다.


*/

import java.util.*;

public class 양과늑대 {

    public static void main(String[] args) {

        int[] info = {0,0,1,1,1,0,1,0,1,0,1,1};
        int[][] edges = {{0,1},{1,2},{1,4},{0,8},{8,7},{9,10},{9,11},{4,3},{6,5},{4,6},{8,9}};

        System.out.println(solution(info, edges));

    }


    static int[][] lines;

    public static int solution(int[] info, int[][] edges) {
        int answer = 0;

        int node = info.length; // 노드의 개수
        int[] visited = new int[node];

        lines = new int[node][node];

        for(int[] ints : edges)
        {
            int start = ints[0];
            int end = ints[1];

            lines[start][end] = 1;
        }

        Queue<dot> que = new LinkedList<>();
        ArrayList<Integer> trace = new ArrayList<>();
        trace.add(0);
        visited[0] = 1;
        que.add(new dot(1,0,trace,visited));

        while(!que.isEmpty())
        {
            dot d = que.poll();


            answer = Math.max(answer, d.lamb);

            for(Integer one : d.trace)
            {
                for(int i = 0; i < node; i++)
                {
                    // 연결되어 있으면 탐색 시작
                    if(lines[one][i] == 1 && d.visited[i] == 0)
                    {
                        // 양인 경우
                        if(info[i] == 0)
                        {
                            // 탐색 가능한 노드의 깊은 복사
                            ArrayList<Integer> newTrace = new ArrayList<>();
                            for(Integer traceOne : d.trace)
                            {
                                newTrace.add(traceOne);
                            }
                            newTrace.add(i);

                            // 지나온 길에 대한 깊은 복사
                            int[] newVisited = new int[node];
                            for(int j = 0; j < node; j++)
                            {
                                newVisited[j] = d.visited[j];
                            }
                            newVisited[i] = 1;

                            // 탐색 가능한 노드 중에서 갈 수 있는 모든 길을 탐색한 경우 제거해준다.
                            int flag = 0;
                            for(int j = 0; j < node; j++)
                            {
                                if(lines[one][j] == 1)
                                {
                                    if(visited[j] == 0)
                                    {
                                        flag = 1;
                                    }
                                }
                            }

                            if(flag == 0)
                            {
                                newTrace.remove(one);
                            }

                            que.add(new dot(d.lamb+1, d.wolf, newTrace, newVisited));
                        }

                        // 늑대인 경우
                        else if(info[i] == 1)
                        {
                            // 늑대가 하나 더 들어와도 양이 더 많을 때만 탐색
                            if(d.wolf + 1 < d.lamb)
                            {
                                // 탐색 가능한 노드의 깊은 복사
                                ArrayList<Integer> newTrace = new ArrayList<>();
                                for(Integer traceOne : d.trace)
                                {
                                    newTrace.add(traceOne);
                                }
                                newTrace.add(i);

                                // 지나온 길에 대한 깊은 복사
                                int[] newVisited = new int[node];
                                for(int j = 0; j < node; j++)
                                {
                                    newVisited[j] = d.visited[j];
                                }
                                newVisited[i] = 1;

                                // 탐색 가능한 노드 중에서 갈 수 있는 모든 길을 탐색한 경우 제거해준다.
                                int flag = 0;
                                for(int j = 0; j < node; j++)
                                {
                                    if(lines[one][j] == 1)
                                    {
                                        if(visited[j] == 0)
                                        {
                                            flag = 1;
                                        }
                                    }
                                }

                                if(flag == 0)
                                {
                                    newTrace.remove(one);
                                }

                                que.add(new dot(d.lamb, d.wolf+1, newTrace, newVisited));
                            }
                        }
                    }
                }
            }
        }


        return answer;
    }

    static class  dot
    {
        int lamb;
        int wolf;
        ArrayList<Integer> trace;
        int[] visited;

        dot(int lamb, int wolf, ArrayList<Integer> trace, int[] visited)
        {
            this.lamb = lamb;
            this.wolf = wolf;
            this.trace = trace;
            this.visited = visited;
        }
    }

}
'Algorithm/프로그래머스 문제풀이' 카테고리의 다른 글
  • [프로그래머스] 경주로 건설 - Java
  • [프로그래머스] 길 찾기 게임 - Java
  • [백준] LCS - Java
  • 프로그래머스 - 파괴되지 않는 건물 Java
너지살
너지살
너지살
너지살개발자
너지살
전체
오늘
어제
  • 분류 전체보기 (375)
    • 잡식 (2)
      • 티스토리 (2)
    • 개발 일지 (0)
      • OMS 프로젝트 (4)
      • 우테코 6기 프리코스 (1)
    • Git (2)
    • JAVA (15)
      • Java 공부 (6)
      • 자료구조 (4)
      • 도움되는 메모 (4)
    • DevOps (18)
      • AWS (6)
      • Docker (2)
      • Jenkins (1)
      • Nginx (1)
      • Kafka (6)
      • RabbitMQ (2)
    • Spring, Spring Boot (16)
      • Test Code (1)
      • AOP (2)
      • Batch (3)
      • Cache - Redis (5)
      • Cloud Config - 설정 파일 관리 (3)
      • 성능 측정 (1)
      • 예외 처리 (1)
    • BackEnd (1)
      • Spring 공부 (1)
      • Thymeleaft (0)
    • DB (17)
      • JPA (2)
      • DB 공부 (3)
      • DB 포스팅 (4)
      • DB 답장 (1)
      • MySQL (2)
      • Redis (5)
      • MongoDB (0)
    • CS (8)
      • Spring (4)
      • DataBase (3)
      • Java (1)
    • Algorithm (203)
      • 알고리즘 개념 (5)
      • 정렬 알고리즘 (11)
      • 프로그래머스 문제풀이 (18)
      • 백준 문제풀이 (165)
      • 소프티어 문제풀이 (3)
      • 알고리즘 시험 정리 (1)
    • SQL (0)
      • 문법 (1)
      • 프로그래머스 문제풀이 (52)
      • 리트코드 문제풀이 (19)
    • IT (1)
      • IT 공부 (1)
    • 정리 (10)
      • 질문 정리 (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Next permutation
  • Spring Batch
  • 분리 집합
  • 깊이/너비 우선탐색
  • 알고리즘
  • Spring Boot
  • 비트마스킹
  • 부분탐색
  • Java 정리
  • Union-Find
  • DFS
  • 최소 신장 트리
  • Spring Boot Redis 연결
  • 병렬 처리
  • 다이나믹프로그래밍
  • 자료구조
  • 데이터베이스
  • dynamiceprogramming
  • 백준
  • 두 포인터
  • cache
  • MST
  • 설정
  • 경로표현식
  • 투 포인터
  • Sorting algorithm
  • 그래프 이론
  • 우선수위큐
  • redis
  • JPA
  • 질문 정리
  • 크루스칼 알고리즘
  • DP
  • Test code
  • docker
  • 소프티어
  • 외판원 순회 문제
  • 최소 스패닝 트리
  • 그래프 탐색
  • Java
  • 다음 순열 찾기
  • db
  • two pointer
  • 다이나믹 프로그래밍
  • 투포인트
  • dynamic programing
  • 유니온파인드
  • Algorithm
  • git
  • Bitmast

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
너지살
[프로그래머스] 양과 늑대 - Java
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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