Skip to content

[정민서-7주차 알고리즘 스터디] #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 50 commits into
base: minseojeong/week7
Choose a base branch
from

Conversation

minseojeong1012
Copy link
Contributor

🚀 싸피 15반 알고리즘 스터디 7주차 [정민서]

📌 문제 풀이 개요

  • 이번 PR에서는 다음 5문제의 풀이를 포함합니다.
  • 각 문제에 대한 풀이 과정과 접근 방식을 설명합니다.

✅ 문제 해결 여부

  • 문제 1 : N과 M (4)
  • 문제 2 : N과 M (5)
  • 문제 3 : N과 M (6)
  • 문제 4 : 암호 구하기
  • 문제 5 : 캠프 준비

💡 풀이 방법

문제 1: N과 M (4)

문제 난이도
실버 3

문제 유형
조합

접근 방식 및 풀이

주어진 문제의 예시를 확인하면 순서의 의미가 있는 조합이 필요하다는 것을 확인 할 수 있었습니다.
또한 같은 수를 조합해도 문제가 없기 때문에 중복 조합 알고리즘을 사용해 문제를 해결했습니다


    static void combi(int cnt, int start) {

        if (cnt == m) {
            for (int i = 0; i < res.length; i++) {
                sb.append(res[i]).append(" ");
            }
            sb.append("\n");
            return;
        }

        for (int i = start; i < input.length; i++) {
            res[cnt] = input[i];
            combi(cnt +1, i);
        }
    }
}

문제 2: N과 M (5)

문제 유형
순열

문제 난이도
실버 3

접근 방식 및 풀이

주어진 예시를 확인했을 때 순서의 의미가 있기에 순열 알고리즘을 사용했습니다
조합의 중복을 허용하지 않기 때문에 boolean 배열을 넣어 중복을 관리했습니다

    static void perm(int cnt) {

        if (cnt == m) {
            for (int i = 0; i < res.length; i++) {
                sb.append(res[i]).append(" ");
            }
            sb.append("\n");
            return;
        }

        for (int i = 0; i < input.length; i++) {

            if (!isSelected[i]) {
                isSelected[i] = true;
                res[cnt] = input[i];
                perm(cnt+1);
                isSelected[i] = false;
            }
        }
    }

}

문제 3: N과 M (6)

문제 유형
조합

문제 난이도
실버 3

접근 방식 및 풀이

위와 같은 방식으로 주어진 예시를 파악 후 조합 알고리즘을 사용하여 문제를 해결했습니다

    static void combi(int cnt, int start) {

        if (cnt == m) {
            for (int i = 0; i < m; i++) {
                sb.append(res[i]).append(" ");
            }
            sb.append("\n");
            return;
        }

        for (int i = start; i < n; i++) {

            res[cnt] = input[i];
            combi(cnt + 1, i + 1);
        }
    }

문제 4: 암호 만들기

문제 유형
조합

문제 난이도
골드 5

접근 방식 및 풀이

문제에서 서로 다른 l개의 알파벳 소문자들로 구성, 최소 한개의 모음과 최소 두개의 자음으로 구성 되어 있다고 해서 자연스럽게 조합 알고리즘이 떠올랐습니다.
하지만 이번 문제에서는 위와 같은 조건이 존재하기 때문에 메서드를 구현할 때 조건을 추가하여 모음과 자음의 개수를 파악해서 관리해주었습니다,

    static void combi(int cnt, int start) {

        if (cnt == l) {

            int vowelCount = 0;
            int letterCount = 0;

            for (int i = 0; i < l; i++) {

                if (res[i] == 'a' || res[i] == 'e' || res[i] == 'o' || res[i] == 'u' || res[i] == 'i') {
                    vowelCount++;
                } else {
                    letterCount++;
                }
            }

            if ( vowelCount >= 1 && letterCount >= 2) {
                for (int i = 0; i < l; i++) {
                    sb.append(res[i]);
                }
                sb.append("\n");
            }
            return;
        }

문제 5: 캠프 준비

문제 유형
조합

문제 난이도
골드 5

접근 방식 및 풀이

원소의 합을 구해야 하기 때문에 순서의 의미가 없다고 판단했고, 따라서 조합 알고리즘을 사용하였습니다. 이전문제와 같이 메서드 구현시에

  • 문제 난이도 합은 l보다 크거나 같고 r보다 작거나 같아야 한다
  • 가장어려운 문제와 쉬운 문제의 난이도 차이는 x보다 크거나 같아야 한다

와 같은 조건을 구현하여 추가해주었습니다

    static void combi(int cnt, int start) {

        if (start == n) {
            if (cnt >= 2) {
                int sum = 0;
                int minVal = Integer.MAX_VALUE;
                int maxVal = Integer.MIN_VALUE;

                for (int i = 0; i < cnt; i++) {
                    sum += res[i];
                    minVal = Math.min(minVal, res[i]);
                    maxVal = Math.max(maxVal, res[i]);
                }

                if (sum >= l && sum <=r && (maxVal - minVal) >=x ) {
                    count++;
                }
            }
            return;
        }

        res[cnt] = input[start];
        combi(cnt+1, start +1);
        combi(cnt, start+1);
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant