no image
[Java] 백준 1935번 문제 (후위 표기식2)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Stack; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Stack operand = new Stack(); HashMap hash = new HashMap(); int N = Integer.parseInt(br.readLine()); String input = br.rea..
2023.10.17
no image
[Java] 백준 11869번 문제 (님블)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); int xor = Integer.parseInt(st.nextToken..
2023.10.05
no image
[Java] 백준 11868번 문제 (님 게임2)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringTokenizer st = new StringTokenizer(br.readLine()); int xor = Integer.parseInt(st.nextToken..
2023.10.05
no image
[Java] 백준 1252번 문제 (이진수 덧셈)
문제설명 소스코드 import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String tempA = sc.next(); String tempB = sc.next(); BigInteger A = new BigInteger(tempA, 2); BigInteger B = new BigInteger(tempB, 2); BigInteger sum = A.add(B); System.out.println(sum.toString(2)); } } 설명 공식 문서를 확인해보면 BigInteger 클래스의 생..
2023.10.03
no image
[Java] 백준 1015번 문제 (수열 정렬)
문제설명 소스코드 import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int arr[][] = new int[2][N]; //2행 N열 배열 for(int i = 0; i < arr[0].length; ++i) { arr[0][i] = sc.nextInt(); //0행 입력받음 arr[1][i] = arr[0][i]; //1행의 값들은 0행의 값들과 같게함 } Arrays.sort(arr[1]); //1행의 값들을 정렬시킴 for(int i = 0; i ..
2023.10.02
no image
[Java] 백준 1417번 문제 (국회의원 선거)
문제설명 소스코드 import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int me = sc.nextInt(); //나 == 다솜 Integer arr[] = new Integer[N-1]; //내림차순 정렬을 위해 박싱 int count = 0; //매수해야 하는 사람 수 for(int i = 0; i < arr.length; ++i) arr[i] = sc.nextInt(); while(true) { ..
2023.10.01
no image
[Java] 백준 1026번 문제 (보물)
문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Collections; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int A[] = new int[n]; Integer B[] = new I..
2023.09.21
no image
[Java] 백준 9663번 문제 (N-Queen)
문제설명 소스코드 import java.util.Scanner; class Main { static boolean[] flag_a = null; static boolean[] flag_b = null; static boolean[] flag_c = null; static int[] pos = null; static void func(int N) { flag_a = new boolean[N]; flag_b = new boolean[2 * N + 1]; flag_c = new boolean[2 * N + 1]; pos = new int[N]; } static int count = 0; static void set(int i, int N) { for (int j = 0; j < N; j++) { if (fla..
2023.08.29

문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Stack;
public class Main
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Double> operand = new Stack<>();
        HashMap<Character, Integer> hash = new HashMap<>();
        int N = Integer.parseInt(br.readLine());
        String input = br.readLine();
        for(int i = 0; i < N; ++i) //A~Z까지 알파벳을 피연산자와 매핑시킴
        {
        	char tmp = 'A';
        	tmp += i;
        	hash.put(tmp, Integer.parseInt(br.readLine()));
        }
        for(int i = 0; i < input.length(); ++i)
        {
        	if(input.charAt(i) == '+' || input.charAt(i) == '-' || input.charAt(i) == '*' || input.charAt(i) == '/')
        	{
                double A = operand.pop();
                double B = operand.pop();
                if(input.charAt(i) == '+') operand.push(B + A);
            	else if(input.charAt(i) == '-') operand.push(B - A);
            	else if(input.charAt(i) == '*') operand.push(B * A);
            	else if(input.charAt(i) == '/') operand.push(B / A);
        	}
        	else operand.push((double)hash.get(input.charAt(i)));
        }
        System.out.printf("%.2f", (double)operand.pop());
    }
}

 

설명

수식의 중위 표기법과 후위 표기법

 

후위 표기식을 계산하는 알고리즘

 

  • 입력의 두 번째 줄에 주어지는 알파벳과 3번째 줄부터 주어지는 피연산자들의 매핑 관계를 만들기 위해 해시테이블을 사용하였다.
  • 부동 소수점의 부정확성 때문에 float말고 double을 사용해야 한다.

문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main
{
	public static void main(String[] args) throws Exception 
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		int xor = Integer.parseInt(st.nextToken());
		for (int i = 1; i < N; ++i) xor = xor ^ Integer.parseInt(st.nextToken()); // 기존 xor값과 새로 들어온 수의 XOR연산 값을 저장
		if(xor != 0) System.out.println("koosaga");
		else System.out.println("cubelover");
	}
}

 

설명

  • 동전의 개수가 3이라 가정하고, 각 동전이 있는 칸번호가 1, 2, 3 이라면
    1을 이진수로 변환하면 0001
    2를 이진수로 변환하면 0010
    3을 이진수로 변환하면 0011
  • 1, 2, 3의 이진수 값을 XOR한다.
    0001 XOR 0010 = 0011(= 1 XOR 2)
    0011 XOR 0011 = 0000(= 1 XOR 2 XOR 3)
    첫 시작은 koosaga이므로 각 동전의 칸 번호 XOR 값이 0(이진수로 0000)이면 cubelover가 승리하고, 0이 아니면 koosaga가 승리한다.

참고

2023.10.05 - [백준] - [Java] 백준 11868번 문제 (님 게임2)

 

[Java] 백준 11868번 문제 (님 게임2)

문제설명 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStrea

rebugs.tistory.com

 

문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main
{
	public static void main(String[] args) throws Exception 
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		int xor = Integer.parseInt(st.nextToken());
		for (int i = 1; i < N; ++i) xor = xor ^ Integer.parseInt(st.nextToken()); // 기존 xor값과 새로 들어온 수의 XOR연산 값을 저장
		if(xor != 0) System.out.println("koosaga");
		else System.out.println("cubelover");
	}
}

 

설명

  • 돌 더미가 3개 있다고 가정하고, 각 돌 더미의 개수가 1, 2, 3 있다면
    1을 이진수로 변환하면 0001
    2를 이진수로 변환하면 0010
    3을 이진수로 변환하면 0011
  • 1, 2, 3의 이진수 값을 XOR한다.
    0001 XOR 0010 = 0011(= 1 XOR 2)
    0011 XOR 0011 = 0000(= 1 XOR 2 XOR 3)
  • 첫 시작은 koosaga이므로 각 돌더미의 개수 XOR 값이 0(이진수로 0000)이면 cubelover 승리하고, 0이 아니면 koosaga가 승리한다.

참고

https://librewiki.net/wiki/%ED%95%84%EC%8A%B9_%EC%A0%84%EB%9E%B5_%EA%B2%8C%EC%9E%84

 

필승 전략 게임

필승 전략 게임은 어느 한 쪽이 반드시 이길 수 있는 전략을 가진 게임을 말한다.

librewiki.net

 

문제설명

 

소스코드

import java.math.BigInteger;
import java.util.Scanner;
public class Main 
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        String tempA = sc.next();
        String tempB = sc.next();
        BigInteger A = new BigInteger(tempA, 2);
        BigInteger B = new BigInteger(tempB, 2);
        BigInteger sum = A.add(B);
        System.out.println(sum.toString(2));
    }
}

 

설명

  • 공식 문서를 확인해보면 BigInteger 클래스의 생성자 매개변수는 우리가 흔히 사용하는 String 타입으로 받는 경우와 int 타입 변수 하나를 더 받는 생성자가 있다.
  • 위 사진의 두 번째 생성자를 이용하면 val을 radix진수로 변환할 수 있다.
    즉 val = "10", radix = 2라면 10을 2진수로 변환한 생성자가 생성되는 것이다.
  • BigInteger 타입은 문자열이기 때문에 메소드를 이용해 사칙연산이 가능하다.
    위 코드에서는 add()메소드를 이용해서 A와 B를 더했다.
  • 마지막으로 BigInteger 클래스이 toString()메소드에 정수형 숫자를 인자로 넘기면 해당 진수로 변환이된다.

문제설명

 

소스코드

import java.util.Arrays;
import java.util.Scanner;
public class Main
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int arr[][] = new int[2][N]; //2행 N열 배열
		for(int i = 0; i < arr[0].length; ++i)
		{
			arr[0][i] = sc.nextInt(); //0행 입력받음
			arr[1][i] = arr[0][i]; //1행의 값들은 0행의 값들과 같게함
		}
		Arrays.sort(arr[1]); //1행의 값들을 정렬시킴
		for(int i = 0; i < N; ++i)//기존 배열과 정렬된 배열의 값이 같은 인덱스를 찾음
		{
			for(int j = 0; j < N; ++j)
			{
				if(arr[0][i] == arr[1][j])//기존 배열과 정렬된 배열의 값이 같다면
				{
					System.out.print(j + " ");//인덱스를 출력함
					arr[1][j] = -1;//중복 인덱스 출력을 방지하기 위해 -1로 바꿈
					break;
				}
			}
		}
	}
}

 

설명

여담이지만, 내가 국어를 못하는건지 수학을 못하는건지 자괴감이 올 정도로 문제 이해 자체가 잘 안되었던 문제이다.

아래의 내용은 chatGPT에게 문제를 쉽게 설명해달라는 부탁의 내용이다.

  • 배열 A[2, 3, 1]이 주어지면 이를 정렬하면 1, 2, 3이 된다.
  • 정렬된 배열의 인덱스를 기존 배열(정렬되지 않은 배열)의 순서대로 출력한다
  • 아래의 그림은 기존 배열과 정렬된 배열을 매핑한 관계를 나타낸다.

  • 2 -> 2 -> 1
    3 -> 3 -> 2
    1 -> 1 -> 0
    이를 나열하면 1, 2, 0이된다.
비내림차순
비내림차순은 내림차순과 반대되는 개념이다.
즉, 오름차순과 비슷한 개념이다.
하지만 오름차순과는 차이가 있다.
오름차순은 왼쪽에서 오른쪽으로 갈때 무조건 숫자가 커져야하지만, 비내림차순은 왼쪽에서 오른쪽으로 갈때 같은숫자가 있을 수도 있다.
chatGPT 답변내용

문제설명

 

소스코드

import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class Main
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int me = sc.nextInt(); //나 == 다솜
		Integer arr[] = new Integer[N-1]; //내림차순 정렬을 위해 박싱
		int count = 0; //매수해야 하는 사람 수
		for(int i = 0; i < arr.length; ++i) arr[i] = sc.nextInt();
		while(true)
		{
			Arrays.sort(arr, Collections.reverseOrder()); //내림차순 정렬
			if(N == 1 || arr[0] < me) break; //N이 0이거나 배열의 가장 큰 수가 나보다 작으면 탈출
			else
			{
				++me;
				--arr[0];
				++count;
			}
		}
		System.out.print(count);
	}
}

 

설명

  • 나(다솜)과 다른 후보의 득표 수를 받는다.
  • 다른 후보의 득표수를 저장한 배열을 내림차순으로 정렬시킨다.
  • 가장 큰 득표수(arr[0])이 나보다 작으면 반복문을 탈출하고, 그렇지 않다면 가장 많은 득표수를 받은 후보의 지지자 한명을 매수한다.

문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main
{
	public static void main(String[] args) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int A[] = new int[n];
		Integer B[] = new Integer[n];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i = 0; st.hasMoreTokens() == true; ++i) A[i] = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		for(int i = 0; st.hasMoreTokens() == true; ++i) B[i] = Integer.parseInt(st.nextToken());
		Arrays.sort(A);
		Arrays.sort(B, Collections.reverseOrder());
		int sum = 0;
		for(int i = 0; i < n; ++i) sum += A[i] * B[i];
		System.out.print(sum);
	}
}

 

설명

  • A는 오름차순으로 정렬하고, B는 내림차순으로 정렬하여 인덱스가 같은 수 끼리 곱해서 더한 값을 출력한다.
배열의 오름차순과 내림차순 정렬
오름차순 정렬
int A[] = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; st.hasMoreTokens() == true; ++i) A[i] = Integer.parseInt(st.nextToken());
Arrays.sort(A); // 오름차순 정렬​


내림차순 정렬

Integer B[] = new Integer[n]; //Integer로 박싱
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; st.hasMoreTokens() == true; ++i) B[i] = Integer.parseInt(st.nextToken());
Arrays.sort(B, Collections.reverseOrder()); //내림차순 정렬, 포장 객체만 올 수 있음

문제설명

 

 

소스코드

import java.util.Scanner;

class Main {
	static boolean[] flag_a = null;
    static boolean[] flag_b = null;
    static boolean[] flag_c = null;
    static int[] pos = null;
	static void func(int N)
	{
		flag_a = new boolean[N];
	    flag_b = new boolean[2 * N + 1];
	    flag_c = new boolean[2 * N + 1];
	    pos = new int[N];
	}
    static int count = 0;
    static void set(int i, int N) 
    {
        for (int j = 0; j < N; j++) 
        {
            if (flag_a[j] == false && flag_b[i + j] == false && flag_c[i - j + N - 1] == false)
            {        
                pos[i] = j;
                if (i == N-1) ++count;
                else 
                {
                    flag_a[j] = flag_b[i + j] = flag_c[i - j + (N - 1)] = true;
                    set(i + 1, N);
                    flag_a[j] = flag_b[i + j] = flag_c[i - j + (N - 1)] = false;
                }
            }
        }
    }
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	int N = sc.nextInt();
    	func(N);
        set(0, N);
        System.out.print(count);
    }
}

 

설명

2023.08.29 - [자료구조 & 알고리즘/알고리즘] - [Java] 8퀸 문제(분기한정법)