Skip to content

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

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/week16
Choose a base branch
from

Conversation

minseojeong1012
Copy link
Contributor

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

📌 문제 풀이 개요

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

✅ 문제 해결 여부

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

💡 풀이 방법

문제 1: 마인크래프트

문제 난이도
실버 2

문제 유형
구현

접근 방식 및 풀이

우선 입력을 받으면서 최소, 최대 높이를 찾습니다

블록을 캐는 건 2초, 놓는 건 1초가 걸린다는 사실을 반복하면서, 시간이 같다면 더 높은 높이를 선택하는 식으로 진행했습니다.

       for (int h = min; h <= max; h++) {
            int time = 0;
            int block = B;

            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    int diff = map[i][j] - h;
                    if (diff > 0) {
                        // 블록 캐기 (2초씩)
                        time += diff * 2;
                        block += diff;
                    } else if (diff < 0) {
                        // 블록 놓기 (1초씩)
                        time += -diff;
                        block += diff; // diff가 음수
                    }
                }
            }

문제 2: 자리배정

문제 유형
구현

문제 난이도
실버 3

접근 방식 및 풀이

1번부터 순서대로 앉을 때, 아래 → 오른쪽 → 위 → 왼쪽 순서로 회전하며 비어있는 좌석에 앉히는 식으로 진행했습니다
좌석이 업다면 0을 출력도록 했습니다,

        while (cnt < K) {
            int nx = x + dx[dir];
            int ny = y + dy[dir];

            if (nx >= 0 && nx < R && ny >= 0 && ny < C && !visited[nx][ny]) {
                x = nx;
                y = ny;
                visited[x][y] = true;
                cnt++;
            } else {
                dir = (dir + 1) % 4; // 방향 전환
            }
        }


문제 3: 빙고

문제 유형
구현

문제 난이도
실버 4

접근 방식 및 풀이

빙고판과 사회자가 부르는 순서를 입력받아 저장하고, 부를 떄마다 해당 숫자를 0으로 마킹했습니다.
3중리상 빙고인 순간 출력하는 방식으로 진행했습니

		//사회자가 부르는 수를
		for (int t = 0; t < length *length; t++) {
			int currentNum = sc.nextInt();
			round++;
			
			for (int i = 0; i < length; i++) {
				for (int j = 0; j < length; j++) {
					if (arr[i][j] == currentNum) {
						arr[i][j] = -1;
					}
				}
			}


문제 4: 걷기

문제 유형
구현

문제 난이도
실버 3

접근 방식 및 풀이

대각선으로 최대한 많이 가는 것이 이득일 수도, 아닐 수도 있기 때문에, 그부분을 고려했고, 만약 대각선 한번이 상하+좌우 두번보다 빠르다면 대각선을 많이 쓰는것이 이득이기에 최소값을 선택했습니

  // 1. 대각선이 두 번 걷기보다 빠른 경우 (S < 2*W)
        if (S < 2 * W) {
            // (1) 둘 다 짝수: 전부 대각선으로 감
            // (2) 홀수/짝수: 대각선으로 가능한 만큼 가고, 나머지는 걷기
            // 두 남은 칸이 홀수면 한 칸만 남음 -> 대각선으로 못 감
            if ((max - min) % 2 == 0) {
                ans = min * S + (max - min) * S;
            } else {
                ans = min * S + (max - min - 1) * S + W;
            }
            ans = Math.min(ans, (X + Y) * W); // 그냥 걷는 경우와 비교
        } else {
            // 2. 그냥 걸어가는 게 이득 (S >= 2W)
            ans = (X + Y) * W;
        }

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