DFS(깊이 우선 탐색) 최대한 깊이 내려간 후, 더 이상 갈곳 없으면 뒤로 돌아오는 방식
"깊이" 현재 노드에서 연결된 노드를 재귀적으로 따라가는 것 , 미로에서 한길로 가다가 막히면 뒤로 돌아와서 다른 길이 있다면 그 길로 가는 것

 

BFS(너비 우선 탐색) 가까운 노드부터 차례로 탐색하는 방식.
DFS는 스택과 비슷 , BFS는 Queue(FIFO) 방식

 

 

DFS
1. 1번에서 2,3,4로 갈 수 있음 2번 으로 이동
2. 2번에서 1,4 이동할 수 있는데 1은 왔던길이니 4로 이동
3. 4번에서는 3으로 갈 수 있음.
4. 3번에서는 이미 방문했으므로 종료
고로 1->2->4->3


BFS
1. graph 리스트에 각 정점의 연결 정보를 저장
2. 시작 정점 1
3. 1에 연결된 정점 : 2,3 -> 오름차순으로 2 먼저 탐색함
4. 2에 연결된 정점 : 4,5 -> 오름차순으로 4 탐색
5. 3에 연결된 정점 : 6

나머지 이미 탐색되어있음 1,2,3,4,5,6

 

bfs는 Queue 인터페이스와 LinkedList를 분리해서 사용 다양한 구현체( LinkedList, PriorityQueue, ArrayDeque 등)을 활용할 수 있음.

Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.poll(); // 정상 동작: Queue 인터페이스의 메서드

LinkedList<Integer> list = new LinkedList<>();
list.addFirst(1); // LinkedList 고유의 메서드 사용 가능
list.add(2);
list.removeFirst(); // Queue의 FIFO 원칙과 맞지 않음

큐의 원칙에 위배되지 않게 , 인터페이스를 통해 동작을 방지할 수 있음 
LinkedList<Integer> list = new LinkedList<>();
LinkedList를 인터페이스로 했을경우 종속적이므로 지양

BFS에서 할일을 생각
1. 값 넣어주기
2. 방문 값 true로 바꿔주기
3. queue가 안비었으면 꺼낸 후 출력
4. 현재 노드와 연결된 모드 노드를 확인하고 , 방문하지 않은 노드 방문처리하고 다시 큐에 추가시킴

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.List;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

class Main{
    static int N; // 정점의 개수
    static int M; // 간선의 개수
    static int V; // 정점 시작 번호
    static List<List<Integer>> adjList; // 근접 노드
    static boolean[] visited; // 방문

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        V = Integer.parseInt(st.nextToken());

        adjList = new ArrayList<>(N+1);
        for(int i=0; i<=N; i++){
            adjList.add(new ArrayList<>());
        }

        for(int i=0; i<M; i++){ // 간선 입력 받아서 넣기
            st = new StringTokenizer(br.readLine()," ");
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            adjList.get(u).add(v);
            adjList.get(v).add(u);
        }

        // 각 리스트들 작은 값 먼저 나와야 함
        for(int i=1; i<=N; i++){
            Collections.sort(adjList.get(i));
        }

        visited = new boolean[N+1]; // 방문체크
        dfs(V);
        System.out.println("");// 줄바꿈
        visited = new boolean[N+1]; // 방문체크
        bfs(V);
    }

    // dfs private으로
    public static void dfs(int n){
        visited[n] = true; // 방문했으니
        System.out.print(n + " ");
        for(int neighbor : adjList.get(n)){ // 방문한 노드 연결된 숫자 체크
            if(!visited[neighbor]){
                dfs(neighbor); // 방문 안했으면 다시 넣어서 방문
            }
        }
    }

    // bfs private으로
    public static void bfs(int n){
        Queue<Integer> q = new LinkedList<>();
        q.add(n);
        visited[n] = true; // 방문했으니 true

        while(!q.isEmpty()){ // q가 비어있지 않을때 까지
            int current = q.poll(); // 현재 꺼 꺼냄
            System.out.print(current + " ");
            for(int next : adjList.get(current)){
                if(!visited[next]){
                    visited[next] = true;
                    q.add(next); // next 방문 안했으면 다시 넣음
                }
            }
        }
    }
}
알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

※ 문제는 제목과 동일합니다.


Think🤔

 

A A B C D D
a f z z 
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x

총 다섯줄이 주어진다.
한 줄의 단어 최대 15개 까지 가능
새로로 읽는 것 출력(공백은 건너뛴다.)
Aa0aPAf985Bz1EhCz2W3D1gkD6X 

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] list = new String[5];
		int maxNum = 0;
		
		for(int i=0; i<5; i++){
			list[i] = br.readLine();
			maxNum = Math.max(maxNum, list[i].length());
		}
		String answer = "";
		for(int i=0; i<maxNum; i++){
			for(int j=0; j<5; j++){
				if(list[j].charAt(i) != ' '){
					answer+=list[j].charAt(i);
				}
			}
		}
		
		System.out.print(answer);
    }
}

 

이렇게 제출했으나 

if(list[j].charAt(i) != ' '){
	answer+=list[j].charAt(i);
}

 

charAt(i)를 가져오지 못하고 ' '이 값과 비교도 못함.
다른 식으로 접근해야되는데 해당 번째를 할때 length를 비교해서 런타임에러가 안나게 변경한다.

abc 인데

abc" " 마지막 글자를 읽을려고해서 오류가 남


Solution✍

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] list = new String[5];
		int maxNum = 0;
		
		for(int i=0; i<5; i++){
			list[i] = br.readLine();
			maxNum = Math.max(maxNum, list[i].length());
		}
		String answer = "";
		for(int i=0; i<maxNum; i++){
			for(int j=0; j<5; j++){
				if(i < list[j].length()){
					answer+=list[j].charAt(i);
				}
			}
		}
		
		System.out.print(answer);
    }
}

Review🤩

 

지금 검사하는 글자의 인덱스가 length보다 작아야 함


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

문제와 동일


Think🤔

 

문제에서 0을 만나면 끝나고 , 101 true 1234 false 양 끝이 똑같을 경우 true를 가지게 됨 이게 팰린드롬수.

출력오류가 발생하는데
마지막에 끝나는 입력값이 0하면 출력이 안되고 끝나야해서 while(!str.equals("0")){ 넣었는데
이렇게 하면 br.readLine이 하나밖에 받지못함.. while문 내부에 있어야지 계속해서 입력되는 br.readLine으로 한줄한줄 받음.


Solution✍

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		while(true){
			String str = br.readLine();
			if(str.equals("0")){break;}
			
			boolean flag = true;
			for(int i=0; i<str.length() / 2; i++){ 
				if(str.charAt(i) != str.charAt(str.length()-i-1)){
					flag = false;
					break;
				}
			}
			if(flag){
				System.out.println("yes");
			}else{
				System.out.println("no");
			}
		}
	}
}

Review🤩

 

length() 괄호 뺴먹어서 틀림
length는 int 배열 길이 가져올때.
str.length()-i-1 빼기1을 해줘야 함.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

제목과 동일


Think🤔

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
		int answer = 0;
		
		for(int i=3; i<n; i++){
			answer = fibo(n-1) + fibo(n-2);
		}
		
		System.out.println(answer);
    }
	
	public static Integer fibo(int n){
		if(n == 0){
			return 0;
		}else if(n == 1){
			return 1;
		}else if(n == 2){
			return 1;
		}else{
			return fibo(n-1) + fibo(n-2);
		}
	}
}

 

시간이 초과날 수 밖에 없다..
메모이제이션 동적 계획법 DP를 사용해야함!
이미 계산값을 저장해두는 방법이 메모이제이션입니다.


Solution✍

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
		if(n==0){
			System.out.println(0);
			return;
		} else if(n==1){
			System.out.println(1);
			return;
		} else if(n==2){
			System.out.println(1);
			return;
		}  
		
		long [] fibo = new long[n+1];
		fibo[0] = 0;
		fibo[1] = 1;
		fibo[2] = 1;
		
		for(int i=3; i<=n; i++){
			fibo[i] = fibo[i-1] + fibo[i-2];
		}
		System.out.println(fibo[n]);
    }
}

Review🤩

 

int로 int[] fibo하면 90같은 큰 숫자의 경우 오버플로우 발생해서 처리하지 못함
long으로 처리해야함..ㄴ


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

제목과 동일


Think🤔

 

1,3,5,7,8,10,12월 -> 31일
4,6,9,11 -> 30일
2 -> 28

int[] days = [31,28,31,30,31,30,31,31,30,31,30,31];
String[] weeks = ["MON","TUE","WED","THU","FRI","SAT","SUN"];

 

1월0일 부터가 아닌 1일부터 MON이여서 -1 빼고 시작

MON 0 1 2 3 4 5 6 
1월1일 : 0 월 31
2월1일 : 3 목 28
3월1일 : 3 목 31
4월1일 : 6 일 30
5월1일 : 1 화


31 * 7 + 30 * 4 + 28 = 365
1,1 -> [ 월 ]
1,2 -> 화
1,3 -> 수
1,4 -> 목
1,5 -> 금
1,6 -> 토
1,7 -> 일

   14
   28 일 29월 30화 31수

2,1 -> [ 목 ]
2,2 -> 금

2,9 -> 금
2,16 -> 금
2,23 -> 금
2,24 -> 토
2,25 -> 일
2,26 -> 월
2,27 -> 화
2,28 -> 수

3,1 -> 목
3,8 -> 목
3,15 -> 목
3,22 -> 목
3,29 -> 목

4,1 -> [ 일 ]
4,8 -> 일
4,15 -> 일 
4,22 -> 일
4,29 -> 일

5,1 -> [ 화 ]


Solution✍

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input = br.readLine();
		StringTokenizer st = new StringTokenizer(input," ");
        
		int a = Integer.parseInt(st.nextToken());
		int b = Integer.parseInt(st.nextToken());
		
		int[] days = {0,31,28,31,30,31,30,31,31,30,31,30,31};
		String[] weeks = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
		
		int tot = 0;
		for(int i=0; i<a; i++){
			tot += days[i];
		}
		tot += b;
		
		System.out.println(weeks[(tot-1)%7]);
    }
}

Review🤩

 

바로 생각이 안나면 다 적어보면서 해결하면 됨.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

문제와 동일


Think🤔

 

입력

2
4 2
출력 8

 

입력
1
2
출력 4

 

입력
6
3 4 2 12 6 8
출력

24

 

이런식으로 테스트 케이스가 주어지고

 

진짜 약수를 구하는 방법이라고 자기 자신의 값과 1은 빠져있음

약수는 양 끝으로 곱하면 약수를 가지는 값인데 ... 설명을 잘 못하겠어서 검색

 

약수의 쌍의 성질로 약수는 서로 곱해져서 원래의 수를 만들고 , 약수는 항상 쌍으로 존재.

 

1하고 자기자신 뺀 약수를 구함.
제일 작은 값하고 제일 큰 값 곱하면 정답이 나온다.


Solution✍

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int[] arr = new int[Integer.parseInt(br.readLine())];
		String[] str = br.readLine().split(" "); 
		for(int i=0; i<str.length; i++){
			arr[i] = Integer.parseInt(str[i]);
		}
		Arrays.sort(arr);
		System.out.println(arr[0] * arr[arr.length-1]);
	}
}

Review🤩

 

코드는 어렵지 않으나 문제를 이해하는데 좀 걸렸었음.


 

+ Recent posts