Skip to content

[이준희-16주차 알고리즘 스터디] #27

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 16 commits into
base: junhee325/week16
Choose a base branch
from

Conversation

JHLEE325
Copy link
Contributor

🚀 싸피 15반 알고리즘 스터디 16주차 [이준희]

📌 문제 풀이 개요

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

✅ 문제 해결 여부

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

💡 풀이 방법

문제 1: 자리배정

문제 난이도
실버 3

문제 유형
구현, 브루트포스

접근 방식 및 풀이
배열의 왼쪽 하단에서부터 시작, 달팽이모양으로 지정된 번호에 도달할 때 까지 탐색하는 문제였습니다. 조건을 설정하여 달팽이 모양으로 돌 수 있게 구현하였습니다.

while(cnt<=count) {
			if(cnt==num) { // 번호 도착한 경우 출력하고 종료
				System.out.println((x+1) + " " + (m-y));
				return;
			}
			if(cnt==count)
				break;
			int dy = y + dir[dnum][0];
			int dx = x + dir[dnum][1];
			
            // 달팽이 모양으로 돌기 위한 조건들
			if(dy<0||dy>=m||dx<0||dx>=n) { // 임계점이거나
				dnum++;
				dnum = dnum%4;
				continue;
			}
			if(map[dy][dx]) { // 이미 방문한 곳을 만나면 방향 전환
				dnum++;
				dnum = dnum%4;
				continue;
			}
			map[dy][dx]=true;
			y=dy;
			x=dx;
			
			cnt++;
		}

문제 2: 걷기

문제 난이도
실버 3

문제 유형
수학

접근 방식 및 풀이
대각선 이동 비용, 직선 이동 비용이 주어질 때 0,0 에서 시작하여 특정위치까지 도달하는 최소 비용을 구하는 문제였습니다. 대각선 이동 비용과 직선 이동 비용의 대소에 따른 분기를 설정하여 풀었습니다.
문제의 입력 수가 커서 타입에 주의해야 하는 문제였습니다.

long height = Math.min(x, y); // 세로 거리

		if (s <= 2 * w) { // 대각선이 이득인 경우
			res += s * height;
		} else {
			res += w * 2 * height;
		}

		long width = Math.max(x, y) - Math.min(x, y); // 가로 거리
		if (width % 2 == 0) { // 남은 거리가 짝수일 때
			if (2 * s <= 2 * w) { // 지그재그가 이득인 경우
				res += 2 * s * (width / 2);
			} else { // 직선 이동이 이득인 경우
				res += w * width;
			}
		} else { // 남은 거리가 홀수일 때
			if (2 * s <= 2 * w) { 
				res += 2 * s * (width / 2);
				res += w;
			} else {
				res += w * width;
			}
		}

문제 3: 빙고

문제 난이도
실버 4

문제 유형
시뮬레이션

접근 방식 및 풀이
빙고판이 주어지고 이후 빙고 숫자가 차례대로 주어질 때 빙고가 3개가 되는 시간을 구하는 문제였습니다. 빙고판을 숫자를 키로 하고 밸류를 좌표로 한 map을 이용하였습니다. 이후 빙고 숫자를 입력 받을 때 마다 get을 활용하여 좌표를 받고 해당 좌표에 따른 가로, 세로, 대각선 배열에 숫자를 추가하여 5가 되는 경우마다 빙고를 체크했습니다.

for (int i = 1; i <= 5; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 1; j <= 5; j++) {
				cnt++;
				int num = Integer.parseInt(st.nextToken());
				int[] temp = list.get(num);

				int r = temp[0];
				int c = temp[1];

				x[r]++; // 가로열 체크
				y[c]++; // 세로열 체크
				if (r == c) diagonal[0]++; // 대각선 1
				if (r + c == 6) diagonal[1]++; // 대각선 2

				// 빙고 개수 체크
				if (x[r] == 5 && !x_done[r]) {
					bingo++;
					x_done[r] = true;
				}
				if (y[c] == 5 && !y_done[c]) {
					bingo++;
					y_done[c] = true;
				}
				if (diagonal[0] == 5 && !d_done[0]) {
					bingo++;
					d_done[0] = true;
				}
				if (diagonal[1] == 5 && !d_done[1]) {
					bingo++;
					d_done[1] = true;
				}

				if (bingo >= 3) { // 조건 만족시
					System.out.println(cnt);
					return;
				}
			}
		}

문제 4: 마인크래프트

문제 난이도
실버 2

문제 유형
구현, 브루트포스

접근 방식 및 풀이
땅의 정보와 가방에 들어있는 흙의 정보를 이용하여 땅을 평평하게 만들 수 있는 시간 중 최솟값을 구하는 문제였습니다. 브루트포스 알고리즘을 이용해 최소 높이부터, 최대 높이까지 모든 경우를 계산하여 최솟값을 도출했습니다.

for (int h = 0; h <= 256; h++) { // 높이를 가능한 경우 모두 탐색
			int remove = 0;
			int place = 0;

			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (map[i][j] > h) {
						remove += map[i][j] - h; // 부셔야 되는 경우 횟수
					} else {
						place += h - map[i][j]; // 설치해야 되는 경우 횟수
					}
				}
			}

			if (remove + b >= place) { // 시간 계산
				int time = remove * 2 + place;
				if (time <= restime) {
					restime = time;
					resh = h;
				}
			}
		}

문제 5 : 청소년 상어

문제 난이도
골드 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