본문 바로가기
Algorithm/BFS & DFS

[프로그래머스] 코딩테스트 고득점 Kit - BFS/DFS (JAVA)

by 루시킴 2021. 10. 1.

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

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+

programmers.co.kr

class Solution {
    int answer=0;
    int total=0;
    public void dfs(int[] n, int sum,int cnt){
        if(cnt==n.length){
            if(sum==total) answer++;
            return;
        }
        dfs(n,sum+n[cnt],cnt+1);
        dfs(n,sum-n[cnt],cnt+1);
    }
    
    public int solution(int[] numbers, int target) {
        total=target;
        dfs(numbers,0,0);
        return answer;
    }
}

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

 

코딩테스트 연습 - 네트워크

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있

programmers.co.kr

class Solution {
    
    public void dfs(int[] visit, int[][] n, int cur){
        visit[cur]=1;
        for(int i=0; i<n[cur].length; i++){
            if(n[cur][i]==1 && cur!=i && visit[i]==0){
                dfs(visit,n,i);
            }
        }
    }
    
    public int solution(int n, int[][] computers) {
        int answer = 0;
        int[] visit=new int[n];
        for(int i=0;i<n; i++){
            if(visit[i]==0){
                dfs(visit,computers,i);
                answer++;
            }
        }
        return answer;
    }
}

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

 

코딩테스트 연습 - 단어 변환

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수

programmers.co.kr

Class 선언

a.charAt(i) != b.charAt(i) : a와 b의 i번 인덱스의 문자 비교

Queue<Node> q = new LinkedList<>() : 큐 선언

q.add(new Node(a,b)) : 큐에 값 삽입

q.poll() : 큐의 맨앞요소 반환 후 삭제. 큐가 비어있으면 null반환

q.peek() : 큐의 맨앞요소 반환. 큐가 비어있으면 null반환

q.isEmpty() : 큐가 비어있으면 True 아니면 False

q.remove() : 큐의 맨앞요소 삭제

Deque<Node> q = new ArrayDeque<>() : 덱 선언

Stack<Integer> s = new Stack<>() : 스택선언

s.push(3) : 삽입

s.pop() : 삭제

s.peek() : 제일 상단 요소 반환

s.empty() : 비어있는지 여부

import java.util.*;

class Solution {
    class Node{
        String s;
        int cnt;
        Node(String s, int cnt){
            this.s = s;
            this.cnt=cnt;
        }
    }
    public boolean check(String a, String b){
        int size = a.length();
        int diff=0;
        for(int i=0; i<size; i++){
            if(a.charAt(i)!=b.charAt(i)) diff++;
            if(diff>=2) return false;
        }
        return true;
    }
    public int solution(String begin, String target, String[] words) {
        int answer = 0;
        boolean[] visit = new boolean[words.length];
        Queue<Node> q = new LinkedList<>();
        q.add(new Node(begin,0));
        while(!q.isEmpty()){
            Node cur = q.poll();
            String str = cur.s;
            int count = cur.cnt;
            if(str.equals(target)) return count;
            for(int i=0; i<words.length; i++){
                if(!visit[i] && check(str,words[i])){
                    visit[i]=true;
                    q.add(new Node(words[i],count+1));
                }
            }
        }
        return answer;
    }
}

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

 

코딩테스트 연습 - 여행경로

[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]

programmers.co.kr

Collections.sort(list) : list 정렬

list.get(0) : list의 0번째 요소 반환

String[] answer = string.split(" ") : 해당 string을 " " 기준으로 나누어서 string배열에 차례대로 저장  

import java.util.*;

class Solution {
    List<String> result = new ArrayList<>();
    
    public String[] solution(String[][] tickets) {
        String[] answer = {};
        boolean[] visit = new boolean[tickets.length];
        dfs(tickets,"ICN","ICN",visit,0);
        Collections.sort(result);
        answer=result.get(0).split(" ");
        return answer;
    }
    void dfs(String[][] tickets, String cur, String tmp, boolean[] visit,int cnt){
        if(cnt==tickets.length){
            result.add(tmp);
            return;
        }
        for(int i=0; i<tickets.length; i++){
            if(!visit[i] && tickets[i][0].equals(cur)){
                visit[i]=true;
                dfs(tickets,tickets[i][1],tmp+" "+tickets[i][1],visit,cnt+1);
                visit[i]=false;              
            }
        }
    }
}

댓글