0, 0, n
을 시작으로 해당 구역에 서로 다른 값이 들어가 있는지 확인한다public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[][] arr;
static boolean flag;
static int white = 0;
static int blue = 0;
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
arr = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
recur(0, 0, n);
System.out.println(white);
System.out.println(blue);
}
static void recur(int x, int y, int n) {
for (int i = x; i < x + n; i++) {
for (int j = y; j < y + n; j++) {
if (arr[i][j] != arr[x][y]) {
recur(x, y, n / 2);
recur(x + n / 2, y, n / 2);
recur(x, y + n / 2, n / 2);
recur(x + n / 2, y + n / 2, n / 2);
return;
}
if(arr[i][j] == 1){
flag = true;
}
else if(arr[i][j] == 0){
flag = false;
}
}
}
if (flag == true)
blue++;
else
white++;
}
}
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// static ArrayList<Integer> arr = new ArrayList<>();
static PriorityQueue<Integer> arr = new PriorityQueue<>();
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
int x = Integer.parseInt(br.readLine());
if (x != 0) {
arr.add(x);
} else {
if (arr.isEmpty()) {
System.out.println(0);
} else {
System.out.println(arr.poll());
}
}
}
}
}
최소 힙 풀이
1. 처음에 ArrayList를 선언해서 0이 아닌 수가 들어올때 정렬을 해주었다.
- 시간초과 발생
2. priorityqueue를 이용하면 큐에 입력될때마다 오름차순으로 자동으로 정렬이 된다.
public class boj_1927 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// static ArrayList<Integer> arr = new ArrayList<>();
static PriorityQueue<Integer> arr = new PriorityQueue<>(Comparator.reverseOrder());
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
int x = Integer.parseInt(br.readLine());
if (x != 0) {
arr.add(x);
} else {
if (arr.isEmpty()) {
System.out.println(0);
} else {
System.out.println(arr.poll());
}
}
}
}
}
앞의 세개의 값을 더하면 구하고자 하는 index의 값을 구할 수 있다.
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int[] result;
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
result = new int[11];
result[1] = 1;
result[2] = 2;
result[3] = 4;
for(int i = 4; i < 11; i++){
result[i] = result[i - 3] + result[i - 2] + result[i - 1];
}
for(int i = 0; i < n; i++){
System.out.println(result[Integer.parseInt(br.readLine())]);
}
}
}
n/3
을 더해주면서 가로 세로 3등분씩 한다.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj_1780 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[][] arr;
static int flag = 0;
static int minus = 0;
static int zero = 0;
static int plus = 0;
public static void main(String[] args) throws IOException {
int n = Integer.parseInt(br.readLine());
arr = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < n; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
recur(0, 0, n);
System.out.println(minus);
System.out.println(zero);
System.out.println(plus);
}
static void recur(int x, int y, int n) {
for (int i = x; i < x + n; i++) {
for (int j = y; j < y + n; j++) {
if (arr[i][j] != arr[x][y]) {
recur(x, y, n / 3); // 첫번째 조각
recur(x + n / 3 , y, n / 3); // 두번째 조각
recur(x + 2 * (n / 3), y, n / 3); // 세번째 조각
recur(x, y + n / 3, n / 3); // 4
recur(x + n / 3, y + n / 3, n / 3); // 5
recur(x + 2 * (n / 3), y + n / 3, n / 3); // 6
recur(x, y + 2 * (n / 3), n / 3); // 7
recur(x + n / 3, y + 2 * (n / 3), n / 3); // 8
recur(x + 2 * (n / 3), y + 2 * (n / 3), n / 3);// 9
return;
}
if(arr[i][j] == -1){
flag = -1;
}
else if(arr[i][j] == 0){
flag = 0;
}
else if(arr[i][j] == 1){
flag = 1;
}
}
}
if (flag == -1)
minus++;
else if (flag == 0)
zero++;
else if (flag == 1)
plus++;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class boj_1620 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static HashMap<String, String> mon;
public static void main(String[] args) throws IOException {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
mon = new HashMap<>();
for (int i = 0; i < x; i++){
String monster = br.readLine();
mon.put(monster, String.valueOf(i + 1));
mon.put(String.valueOf(i + 1), monster);
}
solution(y);
}
public static void solution(int y) throws IOException{
for(int i = 0; i < y; i++){
System.out.println(mon.get(br.readLine()));
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj_1149 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[][] arr;
public static void main(String[] args) throws IOException {
int T = Integer.parseInt(br.readLine());
arr = new int[T][3];
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < 3; j++) { //red:0 ,green:1, blue:2
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
System.out.println(solution(T));
}
static int solution(int T) {
for (int i = 1; i < T; i++) {
arr[i][0] += Math.min(arr[i - 1][1], arr[i - 1][2]);
arr[i][1] += Math.min(arr[i - 1][0], arr[i - 1][2]);
arr[i][2] += Math.min(arr[i - 1][0], arr[i - 1][1]);
}
int min = Integer.MAX_VALUE;
for (int i = 0; i < 3; i++) {
if (min > arr[T - 1][i]) {
min = arr[T - 1][i];
}
}
return min;
}
}
public class boj_1932 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static ArrayList<Integer>[] arr;
public static void main(String[] args) throws IOException {
int T = Integer.parseInt(br.readLine());
arr = new ArrayList[T];
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine(), " ");
arr[i] = new ArrayList<>();
while (st.hasMoreTokens()) {
arr[i].add(Integer.parseInt(st.nextToken()));
}
}
System.out.println(solution(T));
}
static int solution(int T) {
for (int i = 1; i < T; i++) {
for (int j = 0; j < i + 1; j++) {
if (j == 0) {
arr[i].set(j, arr[i - 1].get(j) + arr[i].get(j));
}
else if (j == i) {
arr[i].set(j, arr[i - 1].get(j - 1) + arr[i].get(j));
}
else {
arr[i].set(j, Math.max(arr[i - 1].get(j - 1), arr[i - 1].get(j)) + arr[i].get(j));
}
}
}
int max = Integer.MIN_VALUE;
for (int i = 0; i < T; i++) {
if (max < arr[T - 1].get(i)) {
max = arr[T - 1].get(i);
}
}
return max;
}
}
상대를 최소의 값차이로 이길 수 있어야 한다고 생각해서 일단 정렬 시킨다.
A의 인덱스를 0으로 잡고 B의 인덱스는 모두 탐색하며 현재 A의 인덱스 값보다 큰 B값을 찾으면 A의 인덱스를 하나씩 올린다.
import java.util.*;
class Solution {
public int solution(int[] A, int[] B) {
int answer = 0;
int cnt = 0;
int a_index = 0;
Arrays.sort(A);
Arrays.sort(B);
for(int i = 0; i < A.length; i++){
if(A[a_index] < B[i]){
a_index++;
answer++;
}
}
return answer;
}
}
이 방식으로 테스트를 하면 정확도 테스트는 통과하지만 효율성 테스트를 통과할 수 없다.
오답 풀이와 반대로 n의 값부터 체크한다.
n이 0이 될때까지 반복한다.
import java.util.*;
public class Solution {
public int solution(int n) {
int ans = 0;
while(n != 0){
if(n % 2 == 0){
n /= 2;
}
else{
n -= 1;
ans++;
}
}
return ans;
}
}