inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Giới thiệu về giải quyết vấn đề thuật toán JavaScript (chuẩn bị cho bài kiểm tra mã hóa)

5. Các tập con có cùng tổng (DFS cây nhị phân)

선생님!! 질문있습니다!! 서로소인지는 판별안하나요?

393

YEONGHUN KO

2 câu hỏi đã được viết

0

질문 그대로 입니다. 두 부분집합이 서로소 인 경우는 최대공약수가 1인 경우인데요.

처음 찾은 부분집합이[1,3,5,7] - [6,10]이면 상관없는데 [1,5,10] - [3,6,7] 일경우 서로소 집합이 아닌데도(10 - 6은 서로소가 아니므로 서로소집합이 아니라고 생각합니다) 바로 빠져나가버려서 서로소집합이 아닌 경우에도 yes가 출력될 수 있습니다.

  따라서 ,부분 집합의 합이 서로 같을 경우에 그 다음으로 서로소를 판별하는 과정이 있어야 한다고 생각합니다.

그래서 조금은 길지만 코드를 짜보았습니다!

 function subsetSum(arrLength, set) {
        let result = [];
        let answer = [];
        let tmpArr = [];
        let found = false;
        let sum = set.reduce((a, b) => a + b);

        function compareTwoNum(a, b) {
          let smaller = a > b ? b : a;
          for (let i = 2; i < smaller; i++) {
            let conditionOne = a % i === 0;
            let conditionTwo = b % i === 0;
            if (conditionOne && conditionTwo) {
              return false;
            }
          }
          return true;
        }

        function isRelativePrimeSets(arr, arr2) {
          for (let i = 0; i < arr.length; i++) {
            for (let j = 0; j < arr2.length; j++) {
              if (compareTwoNum(arr[i], arr2[j])) continue;
              else return false;
            }
          }

          return true;
        }

        function dfs(num, set) {
          if (found) return;
          if (num > arrLength - 1) {
            for (let i = 0; i < result.length; i++) {
              if (result[i] === 1) tmpArr.push(set[i]);
            }
            // console.log(tmpArr);
            if (
              tmpArr.length > 0 &&
              tmpArr.reduce((a, b) => a + b) * 2 === sum
            ) {
              let theOther = set.filter(function (e) {
                return this.indexOf(e) < 0;
              }, tmpArr);
              if (isRelativePrimeSets(tmpArr, theOther)) {
                answer.push(tmpArr);
                found = true;
              }
            }
            // if (tmpArr.length > 0) answer.push(tmpArr);
            tmpArr = [];
            return;
          } else {
            result[num] = 1;
            dfs(num + 1, set);
            result[num] = 0;
            dfs(num + 1, set);
          }
        }

        dfs(0, set);
        return answer;
      }

subsetSum(6,[ 1, 3, 5, 6, 7, 10]) // [1, 3, 5, 7]

정말 말그대로 isrelativePrimeSets()을 통해서 하나하나 다 판별한다음 모두 서로소이면 탐색중지(found = true) 아님 계속 탐색하는 식으로  코드를 짜보았습니다!

예를들어 [ 1, 3, 4, 6, 7, 13] 가 주어진 경우 선생님 코드로 실행하게 되면 [1,3,6,7]-[4,13] 이 나오지만 제 코드로 실행하면 [1,3,13]-[4,6,7] 이 나오게 됩니다. 

javascript 코테 준비 같이 해요!

Câu trả lời 2

0

YEONGHUN KO

아하 그렇군요 답변 감사합니다:)

0

codingcamp

안녕하세요^^

문제에서 제가 말한 서로서 집합은 각 원소끼로 서로소가 아니라 둘로 나뉜 두 집합사이의 관계가 서로소집합(두 집합 사이에 공통원소가 없는 경우)이란 뜻이었습니다. 컴퓨터 알고리즘에서 말하는  Disjoint Set  을 말한 것이었습니다.       

                        

continue를 사용하는 이유

0

102

2

정렬 가능 여부 판단하기

0

81

2

알고리즘 학습법 관련해서 질문드립니다.

0

96

1

코드 리뷰 부탁드립니다!

0

107

1

indexOf를 사용해서 풀어보았습니다 !!

0

76

1

저는 이런식으로 구현 해보았습니다 !!

0

69

1

12,13,14 강의 소리만 나오고 검은 화면입니다

0

112

3

반복문 최소화하고 indexOf 사용해서 풀어봤습니다

0

74

1

영상 보기 전에 직접 풀어봤습니다.

0

81

1

섹션1의 17번문제 이 풀이로 풀어도 될까요?

0

145

2

정규표현식으로 처리해도 상관없나요 ?

0

129

2

3칸씩 건너뛸 수 있을 경우

0

133

2

강의에 대해 질문있습니다.

0

144

2

Object와 Set을 이용해 풀어봤습니다.

0

133

2

이렇게 해도 되나요?

0

109

2

선생님 중복 단어나 중복관련 문제들은 set을 이용하면 좋을것 같습니다.

0

149

2

이렇게 풀어도 괜찮을까요?

0

146

1

이렇게 풀어도 괜찮을까요?

0

125

1

모든 아나그램 찾기에서 시간복잡도

0

106

1

코드리뷰 부탁드립니다.

0

140

1

for loop 탈출은 return 문으로 해도 되지 않나요?

0

137

1

투포인트알고리즘으로 풀어봤습니다.

0

148

0

코드 리뷰 부탁드립니다.

0

121

1

코드 맞게 작성한 거 아닌가여??

0

150

1