콘텐츠로 바로가기

now0930 일지

이런저런 생각

  • 홈
  • 비공개
  • 강좌
  • 잔여 작업 조회
  • 위치

프로그래머스 네트워크

DFS인지 BFS인지 헷갈린다. 배우면서 하려니 힘드네. Level3까지만 해야겠다. 남이 작성한 코드 그대로 쓰니 개판되는 듯 하고. 한 문제당 30분이라는데 도저히 못 풀듯.

20년전 배운 linked list, stack, queue를 다시 보니 내가 참 힘들게 살았다. 애고 모가지야.


import java.util.Stack;
import java.util.Arrays;
import java.util.TreeSet;

public class Main {
	public static void main(String[] args) {
		Solution sol = new Solution();
		int[][] nodeMap = new int[3][3];
		nodeMap[0][0] = 1;
		nodeMap[0][1] = 1;
		nodeMap[0][2] = 0;
		nodeMap[1][0] = 1;
		nodeMap[1][1] = 1;
		nodeMap[1][2] = 0;
		nodeMap[2][0] = 0;
		nodeMap[2][1] = 0;
		nodeMap[2][2] = 1;

		sol.solution(3, nodeMap);

		System.out.println("여기");
	}// void main

} // Main

class Solution {
	public int solution(int n, int[][] nodeMap) {

		/*
		 * boolean[] nodeVisited = new boolean[3]; nodeVisited[0] = false;
		 * nodeVisited[1] = false; nodeVisited[2] = false;
		 * 
		 * int[] nodeVisitedInd = new int[3]; nodeVisitedInd[0] = 0; nodeVisitedInd[1] =
		 * 0; nodeVisitedInd[2] = 0; //테스트를 위해 임시로.. //기존 nodeMap을 보고 만들어줘야 됨
		 */
		int[] nodeVisitedInd = new int[nodeMap.length];
		for (int i = 0; i < nodeMap.length; i++)
			nodeVisitedInd[i] = 0;

		// 중복을 삭제하기 위해 만듦.
		TreeSet trimedNodeVisitedInd = new TreeSet();

		int answer = 0;
		boolean flag = false;
		int visitIndex = 1;
		for (int i = 0; i < nodeMap.length; i++) {

//		dfs(nodeMap, nodeVisited, 0, flag);
			System.out.println("**********************");
			System.out.println("제일 바깥쪽 외부 루프");
			System.out.println("visitIndex = " + visitIndex);
			System.out.println("**********************");

			dfs(nodeMap, nodeVisitedInd, i, flag, visitIndex);

			visitIndex++;

		}

		System.out.println("nodeVisitedInd는" + nodeVisitedInd[0] + nodeVisitedInd[1] + nodeVisitedInd[2]);
		for (int i = 0; i < nodeVisitedInd.length; i++) {
			trimedNodeVisitedInd.add(nodeVisitedInd[i]);
		}
		System.out.println("TreeSet 크기는" + trimedNodeVisitedInd.size());
		answer = trimedNodeVisitedInd.size();

		return answer;
	} // solutions

	public static void dfs(int[][] nodeMap, boolean[] nodeVisited, int startNode, boolean flag) {
		Stack<Integer> dfsStack = new Stack<>();
		dfsStack.push(startNode);
		nodeVisited[startNode] = true;
		System.out.println("node " + startNode + " is visited");

		while (!dfsStack.empty()) {
			flag = false;
			int tempNode = dfsStack.peek();
			for (int i = 0; i < nodeMap.length; i++) {
				System.out.println(tempNode + "에서 " + i + " 노드로 검색 시작");
				// 왼쪽에서 오른쪽으로 훑음..1이면 링크가 있음.
				if (nodeMap[tempNode][i] == 1 && !nodeVisited[i]) {
					dfsStack.push(i);
					nodeVisited[i] = true;
					System.out.println("node " + nodeMap[tempNode][i] + " is visited");
					System.out.println("dsfStack has " + Arrays.toString(dfsStack.toArray()));
					flag = true;
					break;

				}

				System.out.println(tempNode + "노드 에서 " + i + "확인");
				System.out.println("길이 없거나 이미 방문하여 생략");
				System.out.println("노드 " + i + "방문 결과는" + nodeVisited[i]);

			} // for loop
			if (!flag) {
				dfsStack.pop();
				System.out.println("pop 실행됨");

			} // if(!flag)

		} // while

	}// dsf..

	public static void dfs(int[][] nodeMap, int[] nodeVisited, int startNode, boolean flag, int visitIndex) {
		Stack<Integer> dfsStack = new Stack<>();
		// for 루프를 돌릴 경우, 재방문을 방지.
		// 조건에 따라 Stack에 push.
		if (nodeVisited[startNode] == 0) {
			dfsStack.push(startNode);
			nodeVisited[startNode] = visitIndex;
			System.out.println("\t****노드 방문****");
			System.out.println("\tnode " + startNode + " is visited");
			System.out.println("\t****노드 방문****");
		}

		while (!dfsStack.empty()) {
			flag = false;
			int tempNode = dfsStack.peek();
			for (int i = 0; i < nodeMap.length; i++) {
				System.out.println(tempNode + "에서 " + i + " 노드로 검색 시작");
				// 왼쪽에서 오른쪽으로 훑음..1이면 링크가 있음.
				if (nodeMap[tempNode][i] == 1 && nodeVisited[i] == 0) {
					dfsStack.push(i);
					nodeVisited[i] = visitIndex;
					System.out.println("\t****노드 방문****");
					System.out.println("\tnode " + i + " is visited");
					System.out.println("\t****노드 방문****");
					System.out.println("node " + nodeMap[tempNode][i] + " is visited");
					System.out.println("dsfStack has " + Arrays.toString(dfsStack.toArray()));
					System.out.println("nodeVisited[" + i + "]는 " + nodeVisited[i]);
					flag = true;
					break;

				}

				System.out.println(tempNode + "노드 에서 " + i + "확인");
				System.out.println("길이 없거나 이미 방문하여 생략");
				System.out.println("노드 " + i + "방문 결과는" + nodeVisited[i]);

			} // for loop
			if (!flag) {
				dfsStack.pop();
				System.out.println("pop 실행됨");

			} // if(!flag)

		} // while

	}// dsf..

}

이 글 공유하기:

  • Tweet
발행일 2019-06-02글쓴이 이대원
카테고리 생활코딩 태그 java, programmers, 코딩, 테스트

댓글 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.

글 내비게이션

이전 글

프로그래머스 주식가격

다음 글

프로그래머스 카펫

2025 5월
일 월 화 수 목 금 토
 123
45678910
11121314151617
18192021222324
25262728293031
4월    

최신 글

  • common mode, differential mode 2025-05-11
  • signal conditioner, 신호 처리기 2025-05-10
  • strain gage 2025-05-09
  • 칼만 필터 2025-05-01
  • positioner(I/P) 2025-04-26

카테고리

  • 산업계측제어기술사
  • 삶 자국
    • 책과 영화
    • 투자
  • 생활코딩
    • LEGO
    • ROS
    • tensorflow
  • 전기기사
  • 피아노 악보

메타

  • 로그인
  • 엔트리 피드
  • 댓글 피드
  • WordPress.org

페이지

  • 소개
  • 잔여 작업 조회
    • 작업 추가
    • 작업의 사진 조회
    • 작업 수정 페이지
  • 사진
    • GPS 입력된 사진
    • 사진 조회
  • 위치
    • 하기 휴가 방문지
    • 해외 출장

태그

android bash c docker driver FSM gps java kernel LEGO linux mysql network program opcua open62541 plc programmers python raspberry reinforcementLearning ros state space system program tensorflow transfer function 경제 미국 민수 삼국지 세계사 실기 에너지 역사 유전자 일본 임베디드 리눅스 전기기사 조선 중국 채윤 코딩 테스트 통계 한국사 한국어

팔로우하세요

  • Facebook
now0930 일지
WordPress로 제작.