Skip to content

Conversation

JHLEE325
Copy link

🚀 싸피 15반 알고리즘 스터디 2학기 1주차 [이준희]

📌 문제 풀이 개요

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

✅ 문제 해결 여부

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

💡 풀이 방법

문제 1: 스도쿠

문제 난이도
골드 4

문제 유형
구현, 백트래킹

접근 방식 및 풀이
너무나 유명한 스도쿠에 대한 구현 문제였습니다.
백트래킹을 활용하여 풀었습니다.
row, col, box 에서 각각 해당 숫자가 있는지 판단할 수 있는 boolaean 배열을 3개 활용했습니다.

   static boolean[][] row = new boolean[9][10]; // row[a][b] = a번째 줄에 b가 있는지
    static boolean[][] col = new boolean[9][10]; // col[a][b] = a번째 칸에 b가 있는지
    static boolean[][] box = new boolean[9][10]; // box[a][b] = a번째 박스에 b가 있는지
static void dfs(int depth) {
        if (depth == blanks.size()) { // 풀었으면 끝
            StringBuilder sb = new StringBuilder();
            for (int[] line : board) {
                for (int num : line) {
                    sb.append(num);
                }
                sb.append('\n');
            }
            System.out.print(sb);
            solved = true;
            return;
        }

        int[] pos = blanks.get(depth); // 빈칸마다 탐색
        int x = pos[0];
        int y = pos[1];
        int boxnum = (x / 3) * 3 + (y / 3);

        for (int num = 1; num <= 9; num++) { // 중복정답인경우 작은 수 출력이므로 1부터 시작
            if (!row[x][num] && !col[y][num] && !box[boxnum][num]) { // 수 검증
                row[x][num] = col[y][num] = box[boxnum][num] = true; // 방문 처리
                board[x][y] = num; // 입력

                dfs(depth + 1);
                if (solved) return;

                board[x][y] = 0; // 백트래킹
                row[x][num] = col[y][num] = box[boxnum][num] = false;
            }
        }
    }

문제 2: 문자열 폭발

문제 난이도
골드 4

문제 유형
자료구조, 문자열

접근 방식 및 풀이
처음에는 java String의 replace를 활용하여 풀었습니다.
위 방식으로 풀었을 때 메모리 초과가 발생하여 다른 방식을 찾아보다가
힌트를 얻어서 풀었습니다.

string을 한글자씩 받고 폭발 문자열보다 길이가 긴 경우 폭발 문자열 길이만큼만 체크하여 폭발시키는 방식으로 풀이하였습니다.

for (char c : str.toCharArray()) {
            sb.append(c);

            if (sb.length() >= blen) {
                if (sb.substring(sb.length() - blen).equals(bomb)) {
                    sb.delete(sb.length()-blen,sb.length());
                }
            }
        }

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

문제 난이도
실버 3

문제 유형
정렬, 누적합

접근 방식 및 풀이
Arrays.sort()를 활용해 비내림차순으로 정렬하고
구간합을 구해놓은 후 주어진 입력대로 출력했습니다.

Arrays.sort(arr); // 비내림차순으로 정렬

        sum[0] = arr[0];
        for (int i = 1; i < n; i++) { // 구간합 구해놓기
            sum[i] = sum[i - 1] + arr[i];
        }

문제 4: 놀이 공원

문제 난이도
골드 1

문제 유형
이분탐색

접근 방식 및 풀이
이분탐색을 통해 줄서있는 모든 아이가 놀이기구에 탑승하는 시간을 구한 후
그 직전 시간의 상태를 이용하여 풀이했습니다.

while (left <= right) { // 모든 아이가 놀이기구를 다 탈 수 있는 시간 중 최소값 구하기
			long mid = (left + right) / 2;
			long total = m;
			for (int i = 0; i < m; i++) {
				total += mid / ride[i];
			}
			if (total >= n) {
				t = mid;
				right = mid - 1;
			} else {
				left = mid + 1;
			}
		}

		long cnt = m;
		for (int i = 0; i < m; i++) { // 모든 아이가 놀이기구를 다 타기 직전의 상태 찾기
			cnt += (t - 1) / ride[i];
		}

		for (int i = 0; i < m; i++) { // 놀이기구를 다 탄 시점
			if (t % ride[i] == 0) { // 이 때 0이므로 탈 수 있음
				cnt++;
				if (cnt == n) { // 줄 마지막 아이가 탔으면 출력
					System.out.println(i + 1);
					break;
				}
			}
		}

문제 5: 저울

문제 난이도
골드 4

문제 유형
그래프 이론, 플로이드-워셜

접근 방식 및 풀이
무거운 경우는 1, 가벼운 경우는 2로 표시한 2차원 배열을
방향이 있는 플로이드-워셜 처럼 구현하여 풀었습니다.

for (int k = 0; k < n; k++) { // 방향이 있는 플로이드-워셜
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (w[i][k] == 1 && w[k][j] == 1) w[i][j] = 1; // a가 b보다 무겁고 b가 c보다 무거우면 a는 c보다 무겁다
                    if (w[i][k] == 2 && w[k][j] == 2) w[i][j] = 2;
                }
            }
        }

@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.

2 participants