Coding - DFS/BFS
타겟 넘버
        from Programmers
        문제 설명
        n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.
        
        -1+1+1+1+1 = 3
        +1-1+1+1+1 = 3
        +1+1-1+1+1 = 3
        +1+1+1-1+1 = 3
        +1+1+1+1-1 = 3
        사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
        
        제한사항
        주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
        각 숫자는 1 이상 50 이하인 자연수입니다.
        타겟 넘버는 1 이상 1000 이하인 자연수입니다.
        입출력 예
        numbers	target	return
        [1, 1, 1, 1, 1]	3	5
        [4, 1, 2, 1]	4	2
        입출력 예 설명
        입출력 예 #1
        
        문제 예시와 같습니다.
        
        입출력 예 #2
        
        +4+1-2+1 = 4
        +4-1+2-1 = 4
        총 2가지 방법이 있으므로, 2를 return 합니다.
      
#include <string> #include <vector> #include <iostream> using namespace std; int answer = 0; void DFS(vector<int> numbers, int target, int depth, int value){ if(depth>numbers.size()){ return; } if(target==value&&depth==numbers.size()){ answer++; } DFS(numbers, target, depth+1, value+numbers[depth]); DFS(numbers, target, depth+1, value-numbers[depth]); } int solution(vector<int> numbers, int target) { DFS(numbers, target, 0, 0); return answer; }
네트워크
        from Programmers
        문제 설명
        네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
        
        컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
        
        제한사항
        컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
        각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
        i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
        computer[i][i]는 항상 1입니다.
        입출력 예
        n	computers	return
        3	[[1, 1, 0], [1, 1, 0], [0, 0, 1]]	2
        3	[[1, 1, 0], [1, 1, 1], [0, 1, 1]]	1
        입출력 예 설명
        예제 #1
        아래와 같이 2개의 네트워크가 있습니다.
        image0.png
        
        예제 #2
        아래와 같이 1개의 네트워크가 있습니다.
        image1.png
      
#include <string> #include <vector> using namespace std; void DFS(int from, int n, vector<int> &visited, vector<vector<int>> &computers) { for (int i = 0; i < n; i++) { if (from != i && computers[from][i] == 1 && visited[i] == 0) { visited[i] = 1; DFS(i, n, visited, computers); } } } int solution(int n, vector<vector<int>> computers) { int network = 0; vector<int> visited(n, 0); for (int i = 0; i <n; i++) { if (visited[i] == 1) { continue; } // visit node and start DFS network++; visited[i] = 1; DFS(i, n, visited, computers); } return network; }
단어 변환
        from Programmers
        문제 설명
        두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.
        
        1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
        2. words에 있는 단어로만 변환할 수 있습니다.
        예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.
        
        두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.
        
        제한사항
        각 단어는 알파벳 소문자로만 이루어져 있습니다.
        각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
        words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
        begin과 target은 같지 않습니다.
        변환할 수 없는 경우에는 0를 return 합니다.
        입출력 예
        begin	target	words	return
        "hit"	"cog"	["hot", "dot", "dog", "lot", "log", "cog"]	4
        "hit"	"cog"	["hot", "dot", "dog", "lot", "log"]	0
        입출력 예 설명
        예제 #1
        문제에 나온 예와 같습니다.
        
        예제 #2
        target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.
      
Contact
  • Address : 서울특별시 서대문구 북아현로22길 18 (힐사이드빌) 302호
  • E-mail : june3004@naver.com
  • Tel : 010-5886-9393
  • 이 페이지는 프로필, 일기장, 정보공유, 공부 포트폴리오로 만들 예정입니다.