Skip to content

Conversation

zinnnn37
Copy link
Contributor

@zinnnn37 zinnnn37 commented Jul 19, 2025

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

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

💡 풀이 방법

문제 1: 스도쿠

문제 난이도
골드 4

문제 유형
백트래킹

접근 방식 및 풀이
전형적인 백트래킹 문제였습니다.
1차적으로 행을 1씩 늘려가며 확인하고, 행이 8을 넘어가는 경우 다음 열을 확인합니다.
열이 9가 되는 경우 정답이 되는 스도쿠를 찾은 것이므로 반환하여 출력합니다.
1부터 채워넣기 때문에 가장 처음에 발견하는 답이 사전식으로 가장 앞서는 경우입니다.


문제 2: 문자열 폭발

문제 난이도
골드 4

문제 유형
스택

접근 방식 및 풀이
전형적인 스택 문제라고 생각합니다.
알파벳 하나씩 스택에 넣다가 부문자열을 찾는 경우 pop()을 진행합니다.
과정이 종료된 후 스택을, 비었다면 FRULA를 출력합니다.

출력이나 부문자열 확인이 귀찮을 줄 알았는데 자바는 스택도 임의접근이 되어서 그냥 스택 썼어용


문제 3: 이건 꼭 풀어야해!

문제 난이도
실버 3

문제 유형
정렬 누적합

접근 방식 및 풀이
간단한 누적합 문제였습니다.
정렬한 후 누적합 배열을 생성해서 prefix[R] - prefix[L-1]을 하면 됩니다.


문제 4: 놀이공원

문제 난이도
골드 1

문제 유형
이분 탐색

접근 방식 및 풀이
어떻게 접근해야할 지 잘 모르겠어서 검색 좀 했습니다..

📍 동작 흐름

  1. 특정 시간에 얼마만큼의 많은 아이들이 기구를 탈 수 있는지 확인 필요
  2. N번째 아이가 탈 수 있는 시간의 범위 중 가장 짧은 시간을 찾음
    → 이분탐색 사용
while (left <= right) {
	long mid = (left + right) / 2;
	long totalChildren = M;

	// mid 시간에 탈 수 있는 아이의 수
	for (int i = 0; i < M; i++) {
		totalChildren += mid / opTime[i];
	}

	// N명 이상의 아이가 탈 수 있음 → 범위 좁히기
	if (totalChildren >= N) {
		targetTime = mid;
		right      = mid - 1;
	} else {
		left = mid + 1;
	}
}

right는 최대 소요시간 N / M * 30L으로 초기화

  1. 그 시간대에 비는 기구 중 가장 숫자가 작은 기구의 번호를 찾음
    → 2. 에서 가장 짧은 시간을 찾기 때문에 적어도 하나의 기구가 비어있음이 보장됨
for (int i = 0; i < M; i++) {
	if (time % opTime[i] == 0) {
		childrenBefore++;
		if (childrenBefore == N) {
			bw.write((i + 1) + "\n");
			return;
		}
	}
}

time % opTime[i] == 0인 가장 첫 인덱스가 N번째 아이가 탈 기구(단, 0부터 시작하므로 +1 필요)


문제 5: 저울

문제 난이도
골드 4

문제 유형
플로이드-워셜

접근 방식 및 풀이
플로이드 워셜 그대로 적용시키면 되는데 상태가 3가지이므로 불리언 대신 정수 배열을 사용했습니다.

for (int k = 1; k < N + 1; k++) {
	for (int i = 1; i < N + 1; i++) {
		for (int j = 1; j < N + 1; j++) {
			// big
			if (mat[i][k] == 1 && mat[k][j] == 1) {
				mat[i][j] = 1;

				// small
			} else if (mat[i][k] == -1 && mat[k][j] == -1) {
				mat[i][j] = -1;
			}
		}
	}
}

📍 상태

  1. a > b: 1
  2. a < b : -1
  3. 알 수 없음: 0
    k를 거쳤을 때의 루트 모두 1이거나 -1인 경우 [i][j]±1

@zinnnn37 zinnnn37 added the 😇[2]1주차 2학기 1주차 label Jul 19, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
😇[2]1주차 2학기 1주차
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant