Skip to content

[김민진-15주차 알고리즘 스터디] #94

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 4 commits into
base: main
Choose a base branch
from

Conversation

zinnnn37
Copy link
Contributor

@zinnnn37 zinnnn37 commented May 4, 2025

🚀 싸피 15반 알고리즘 스터디 15주차 [김민진]

📌 문제 풀이 개요

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

✅ 문제 해결 여부

  • 문제 1
  • 문제 2
  • 문제 3
  • 문제 4
  • 문제 5

지금 좀 시간감각이 없어서.. 죄송..

💡 풀이 방법

문제 1: 온풍기 안녕!

문제 난이도
플래티넘 5

문제 유형
구현 시뮬레이션

접근 방식 및 풀이
열심히 푸는 중입니다.. 빨리 풀게요


문제 2: 후위 표기식

문제 난이도
골드 2

문제 유형
스택

접근 방식 및 풀이

📍 연산자 우선순위 저장용 맵

private static final Map<Character, Integer> OP = new HashMap<>() {
    {
        put('+', 0);
        put('-', 0);
        put('*', 1);
        put('/', 1);
        put('(', -1);
        put(')', -1);
    }
};
  1. 숫자
    : 바로 붙이기

  2. 괄호

    1. 여는 괄호는 바로 넣기
    2. 닫는 괄호가 나오면 여는 괄호가 나올 때까지 전부 pop()
      → 그 내부에서의 우선순위는 이미 다 적용되었음
  3. 일반 연산자
    : 우선순위가 본인보다 작은 것이 나올 때까지 pop()하여 출력


문제 3: 행복 유치원

문제 난이도
골드 5

문제 유형
그리디 정렬

접근 방식 및 풀이
🌟 티셔츠 만드는 비용이 최소가 될 때를 구해야 하는 것이지 실제로 나누는 것이 목적이 아님
→ 인접한 원생의 키 차이 kids[i] - kids[i-1]를 구하여 pq에 넣음

📍 N-K번 동안 차이가 적은 순서로 확인하여 계속 더함
K개의 그룹이 될 때까지 키 차이를 더하는 것
→ 어느 그룹에 속하는지, 누가 어떤 그룹인지는 구하지 않아도 되기 때문에 가능한 풀이


문제 4: 나머지 합

문제 난이도
골드 3

문제 유형
수학 누적합

접근 방식 및 풀이
🌟 누적합의 나머지 값을 mod에 저장
→ 누적합이 같은 구간을 빼면 나머지가 0이 됨
e.g. mod[1] == 2이고 mod[5] == 2이면 [2:5] 구간합은 M으로 나누어 떨어짐

(a × M + 2) - (b × M + 2)
= a ・ M - b ・ M
≡ 0 (mod 0)

📍 nC2

nC2
= n! / (2! × (n-2)!)
= (n × (n-1) × (n-2)!) / (2 × (n-2)!)
= (n × (n-1)) / 2

문제 5: 제곱수의 합

문제 난이도
실버 2

문제 유형
DP 수학

접근 방식 및 풀이

dp[1] = 1^2
dp[2] = 1^2 + 1^2
dp[3] = 1^2 + 1^2 + 1^2
dp[4] = 2^2
dp[5] = 2^2 + 1^2
dp[6] = 2^2 + 1^2 + 1^2
dp[7] = 2^2 + 1^2 + 1^2 + 1^2
dp[8] = 2^2 + 2^2
dp[9] = 3^2
dp[10] = 3^2 + 1^2
...
  1. 제곱수인 경우 dp 값이 1
  2. 제곱수의 배수의 경우 배수 / 제곱수
  3. 그 외에는 dp[i - 1] + 1
    dp[i - 제곱수] + 1 값 중 가장 작은 값이 idp 값이 된다
dp = new int[N + 1];

for (int i = 1; i <= N; i++) {
    dp[i] = i;
    for (int j = 1; j * j <= i; j++) {
        dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
    }
}

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

Successfully merging this pull request may close these issues.

1 participant