Skip to content
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

남희수 / 11월 1주차 / 목 #320

Open
wants to merge 23 commits into
base: main
Choose a base branch
from

Conversation

skagmltn7
Copy link
Contributor


🎈boj 24891 - 단어 마방진


🗨 해결방법 :


  1. 사전 순으로 가장 빠른 마방진을 찾으면 더이상 진행하지 않기 위해서 입력받는 문자열을 정렬
  2. 첫 번째 문자열을 비교하면서 L-1개를 뽑기
    • [cnt-1][0] = [0][cnt-1]같은 애만 일단뽑기(첫 번째 뽑는 기준)
  3. L개되면 for r=1부터 대각선 문자열 검사 inx+1부터 검사시작
    • 검사 충족하면 알고리즘 종료
    • 안하면 2번알고리즘 다시 시작

📝메모 :


✔코드 :

import java.io.*;
import java.util.*;

// 단어 정렬 String
// 조합 L개뽑기 -> 첫번째 문자열 박아놓고 cnt-1 [cnt-1][0] = [0][cnt-1]같은 애만 일단뽑기
// L개되면 for r=1부터 대각선 문자열 검사 inx+1부터 검사시작

public class Main {
	private static int L, N;
	private static String[] inputs, ans;
	private static StringBuilder sb = new StringBuilder();
	private static boolean[] used;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		L = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		inputs = new String[N];
		for (int i = 0; i < N; i++) {
			inputs[i] = br.readLine();
		}
		Arrays.sort(inputs);
		ans = new String[L];
		used = new boolean[N];
		for (int i = 0; i < N; i++) {
			used[i] = true;
			ans[0] = inputs[i];
			if (combi(1))
				break;
			used[i] = false;
		}
		System.out.println(sb.length() == 0 ? "NONE" : sb.toString());
	} // end of main

	private static boolean combi(int cnt) {
		if (cnt == L) {
			if (chkBoard()) {
				for (int i = 0; i < L; i++) {
					sb.append(ans[i]).append("\n");
				}
				return true;
			}
			return false;
		}
		for (int i = 0; i < N; i++) {
			if (!used[i] && ans[0].charAt(cnt) == inputs[i].charAt(0)) {
				used[i] = true;
				ans[cnt] = inputs[i];
				if (combi(cnt + 1)) {
					return true;
				}
				used[i] = false;
			}
		}
		return false;

	}

	private static boolean chkBoard() {
		for (int i = 1; i < L; i++) {
			for (int j = i + 1; j < L; j++) {
				if (ans[i].charAt(j) != ans[j].charAt(i))
					return false;
			}
		}
		return true;
	}
} // end of class


🎈boj 3151 - 합이 0


🗨 해결방법 :


  1. 세 개의 숫자의 합이 0이어야하기 때문에 하나를 기준으로 오른쪽 범위를 투포인트로 검사
  2. 합이 0인지 확인
    • left와 right가 같은 숫자인 경우 combination
    • left와 중복된 숫자가 있는지
    • right와 중복된 숫자가 있는지 확인
  3. 합이 음수면 0에 가까워지기 위해 left를 옮김
  4. 합이 양수면 0에 가까워지기 위해 right를 옮기

📝메모 :


✔코드 :

import java.io.*;
import java.util.*;

public class Main {
	private static int N;
	private static long ans;
	private static int[] students;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		students = new int[N];
		for (int i = 0; i < N; i++) {
			students[i] = Integer.parseInt(st.nextToken());
		}
		Arrays.sort(students);
		ans = 0;
		for (int i = 0; i < N && students[i] <= 0; i++) {
			grouping(students[i], i + 1, students.length - 1);
		}
		System.out.println(ans);
	} // end of main

	private static void grouping(int target, int left, int right) {
		while (left < right) {
			int sum = target + students[left] + students[right];
			if (sum == 0) {
				int l = 1;
				int r = 1;
				if (students[left] == students[right]) {
					ans += combi(right - left + 1);
					break;
				}
				while (left + 1 < right && students[left] == students[left + 1]) {
					l++;
					left++;
				}
				while (left < right - 1 && students[right] == students[right - 1]) {
					r++;
					right--;
				}
				ans += l * r;
			}
			if (sum < 0) {
				left++;
			} else {
				right--;
			}
		}
	}

	private static long combi(int n) {
		return n * (n - 1) / 2;
	}

} // end of class


🎈boj 30024 - 옥수수밭


🗨 해결방법 :


  1. 가장 먼저 접근할 수 있는 부분이 테두리이기 때문에 테두리 먼저 pq에 넣기
  2. K번 pq 최댓값빼기
  3. 최댓값 뺀 곳에서 pq에 아직 넣지 않은 상하좌우노드 넣기(visited로 넣었는지 체크)

📝메모 :


✔코드 :

import java.io.*;
import java.util.*;


public class Main {
	private static int N, M, K;
	private static boolean[][] visited;
	private static PriorityQueue<Corn> pq = new PriorityQueue<Corn>((c1, c2) -> Integer.compare(c1.value, c2.value)*-1);
	private static int[][] map;
	private static int[] dy = { -1, 0, 1, 0 };
	private static int[] dx = { 0, 1, 0, -1 };

	static class Corn {
		int y;
		int x;
		int value;

		public Corn(int y, int x, int value) {
			super();
			this.y = y;
			this.x = x;
			this.value = value;
		}
	}

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		visited = new boolean[N + 2][M + 2];
		map = new int[N + 2][M + 2];
		for (int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 1; j <= M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if (i == 1 || i == N || j == 1 || j == M) { // 테두리 값 넣어주기
					visited[i][j] = true;
					pq.add(new Corn(i, j, map[i][j]));
				}
			}
		}
		K = Integer.parseInt(br.readLine());
		System.out.println(getCorn());
	} // end of main

	private static String getCorn() {
		StringBuilder sb = new StringBuilder();
		for (int cnt = 0; cnt < K && !pq.isEmpty(); cnt++) {
			Corn cur = pq.poll();
			sb.append(cur.y).append(" ").append(cur.x).append("\n");
			for (int i = 0; i < 4; i++) {
				int ny = cur.y + dy[i];
				int nx = cur.x + dx[i];
				if (chkRange(ny, nx) && !visited[ny][nx]) {
					visited[ny][nx] = true;
					pq.add(new Corn(ny, nx, map[ny][nx]));
				}
			}
		}
		return sb.toString();
	}

	private static boolean chkRange(int ny, int nx) {
		return 1 <= ny && ny <= N && 1 <= nx && nx <= M;
	}
} // end of class

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