60장. 합이 같은 부분집합 (DFS : 아마존 인터뷰)
N개의 원소로 구성된 자연수 집합이 주어지면 이 집합을 두 개의 부분집합으로 나누었을 때 두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES”를 출력하고, 그렇지 않으면 “NO”를 출력하는 프로그램을 작성하세요.
예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10}으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다.
입력
첫 번째 줄에 자연수 N(1<=N<=10)이 주어집니다. 두 번째 줄에 집합의 원소 N개가 주어진다. 각 우너소는 중복되지 않는다.
출력
첫 번째 줄에 “YES” 또는 “NO”를 출력한다.
1 |
|
어찌 저찌 풀었지만… 과연 이게 가장 효율적인 방법인가… 그거에 대한 확신은 없다.. 쩝.. 선생님 코드를 확인해보아야겠다!
선생님 코드
1 |
|
포인트는 DFS 함수에 level 뿐만 아니라 sum을 같이 넣은 것!
61장. 특정 수 만들기 (DFS : MS 인터뷰)
N개의 원소로 구성된 자연수 집합이 주어지면, 집합의 원소와 ‘+’, ‘-‘ 연산을 사용하여 특정 수인 M을 만드는 경우가 몇 가지 있는지 출력하는 프로그램을 작성하세요. 각 원소는 연산에 한번만 사용합니다.
예를 들어, {2, 4, 6, 8}이 입력되고 M=12 이면
2 + 4 + 6 = 12 4 + 8 = 12 6 + 8 - 2 = 12 2 - 4 + 6 + 8 = 12
로 총 4가지의 경우가 있다. 만들어지는 경우가 존재하지 않으면 -1를 출력한다.
1 |
|
모르겠다.. 어렵다.. 선생님 강의 도움..을 해야겟다 헉억
풀었다!! 여기서는 DFS를 두번 사용해서 풀어야했다. 먼저 ch 배열로 있는지 없는지를 선택한 후 극성을 넣어주어야 했던 문제였다. 그 후에는 극성을 선택해주는 polarity를 선택해주는 경우를 또 DFS를 통해 구해줘야 했다.
근데 이게 맞는 건지는 모르겠다. 선생님 강의를 봐야겠다.
선생님 코드
선생님은 진짜 획기적으로 쉽게 푸셨다. ㅋㅋㅋㅋㅋㅋ 여기서 포인트는 DFS 가닥이 3개 있다고 생각하는 것!?
1 |
|
선생님은.. 다시 한번 말하지만
“천재” ….