본문 바로가기
알고리즘/백준

[단계별로 풀어보기-Java] 8단계 일반 수학1

by 꾸주니=^= 2025. 1. 30.

백준 사이트 로고

 

안녕하세요~

오늘은 8단계 일반 수학1을 푸는 날입니다!


✏️ 문제 번호 : 2745
진법 변환

 

문제 살펴보기

B진법 수 N을 10진법으로 변환해야 합니다.

여기서, 진법 변환 개념에 대해 숙지하고 있어야 합니다.

예를 들어,
36진법에서 "ZZZZZ"를 10진법으로 변환해보겠습니다.

Z는 35이고
Z의 각 자리 수(35)36^(자리수)곱해야 합니다.

ZZZZZ = (35 * 36^4 ) + (35 * 36^3) + (35 * 36^2) + (35 * 36^1) + (35 * 36^0)
ZZZZZ(36진법) = 60466175(10진법) 이 됩니다.

 

import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        String N = sc.next();
        int B = sc.nextInt();

        int transform = Integer.parseInt(N, B);

        System.out.println(transform);

        sc.close();
    }
}

 

풀이 과정

B진법 수 N을 10진법으로 변환하는 프로그램을 작성해야 합니다.

Integer.parseInt(String s, int radix) 메서드를 사용해서
B진법 숫자를 10진법으로 변환합니다.

Integer.parseInt(N, B) 
B진법 숫자 N을 10진법으로 변환합니다.

 


✏️ 문제 번호 : 11005
진법 변환2

 

문제 살펴보기

위 문제는 (2745)진법 변환과 반대로 작동하는 프로그램 입니다.

10진수 N변환할 진법 B를 입력 받고, 변환할 진법의 문자를 출력합니다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int B = sc.nextInt();

        String transform = Integer.toString(N, B).toUpperCase();

        System.out.println(transform);

        sc.close();
    }
}

 

풀이 과정

 Integer.toString(N, B)를 사용해서
10진수 N을 B진법 문자열로 변환합니다.

toUpperCase()을 사용해서 대문자로 출력하게 했습니다.

 


✏️ 문제 번호 : 2720
세탁소 사장 동혁

 

문제 살펴보기

 쿼터(Quarter, $0.25)의 개수
다임(Dime, 
$0.10)의 개수
니켈(Nickel, 
$0.05)의 개수
페니(Penny, 
$0.01)의 개수
구하기

거스름돈은 항상 $5.00이하,
손님이 받는 동전의 개수를 최소로 하려고 함

 

입력값

첫째 줄 : 테스트 케이스 개수 T

거스름돈 C
C의 단위는 센트
(1달러 = 100센트)
(1 <= C <= 500)

 

출력값

쿼터의 개수   다임의 개수   니켈의 개수   페니의 개수

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());

        for (int i = 0; i < T; i++) {
            int N = Integer.parseInt(br.readLine());

            int q = N / 25; N %= 25;
            int d = N / 10; N %= 10;
            int n = N / 5;  N %= 5;
            int p = N;

            System.out.println(q + " " + d + " " + n + " " + p);
        }
    }
}

 

풀이 과정

 각 테스트 케이스마다 N(거스름돈, 센트 단위)을 입력 받고
쿼터 -> 다임 -> 니켈 -> 페니 순서대로 나눕니다.

 


✏️ 문제 번호 : 2903
중앙 이동 알고리즘

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int result = (int) (Math.pow(2,N)+1);
        System.out.println(result * result);
    }
}

 

풀이 과정

(2^N + 1)²

한 변의 점 개수를 제곱한 값이 전체 점의 개수입니다.

[거친 과정 수]              [한 변의 점 개수]               [전체 점 개수]
         0                                    2                                    4
         1                                     3                                    9
         2                                     5                                   25

 


✏️ 문제 번호 : 2292
벌집

 

 

문제 살펴보기

 1개 : 1
2개 : 2 ~ 7 (+6)
3개 : 8 ~ 19 (+12)
4개 : 20 ~ 37 (+18)
5개 : 38 ~ 61 (+24)

....

숫자 1을 제외하고,
6단위로 거리가 1씩 늘어나는 것을 알 수 있습니다.

그러므로 1일 때 조건을 따로 하고,
2부터 다른 조건을 적용합니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        int count = 1;
        int range = 2;

        if (N == 1){
            System.out.println(count);
        }
        else{
            while(range <= N){
                range = range + (6*count);
                count ++;
            }
            System.out.println(count);
        }
    }
}

 


✏️ 문제 번호 : 1193
분수찾기

 

문제를 봐도 모르겠어서 짚티 도움을.. ㅎㅎ

 

문제 살펴보기

 표를 살펴보면
분수들이 대각선 방향으로 순차적으로 채워져 있습니다.

1. 대각선의 규칙

1번째 대각선 : 1개
(1) 1/1

2번째 대각선 : 2개
(2) 1/2
(3) 2/1

3번째 대각선 : 3개
(4) 3/1
(5) 2/2
(6) 1/3

4번째 대각선 : 4개
(7) 1/4
(8) 2/3
(9) 3/2
(10) 4/1

...

대각선 k번째까지의 총 개수는
1 + 2 + 3 + ... + k = k * (k+1) / 2

 

2. 풀이 방법

1. X가 속한 대각선 k를 찾기

1 + 2 + ... + k 를 계산하면서 X보다 커지는 지점이 k
k * (k + 1) / 2 >= X가 되는 최소 k를 찾기

2. 대각선 내부에서 X의 위치 찾기

X가 속한 대각선에서 start = k * (k - 1) / 2 + 1
index = X - start (해당 대각선 내에서 0부터 시작하는 인덱스)

3. 분수 계산

k가 홀수일 때: (분자, 분모) = (k - index, index + 1)
k가 짝수일 때: (분자, 분모) = (index + 1, k - index)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int X = Integer.parseInt(br.readLine());

        int k = 1; // 대각선 번호
        while (k * (k + 1) / 2 < X) { // X가 포함될 k를 찾기
            k++;
        }

        int start = k * (k - 1) / 2 + 1; // 해당 대각선의 시작 숫자
        int index = X - start; // 해당 대각선 내에서 X의 위치

        int numerator, denominator;
        if (k % 2 == 1) { // 홀수 번째 대각선이면 분자가 감소
            numerator = k - index;
            denominator = index + 1;
        } else { // 짝수 번째 대각선이면 분자가 증가
            numerator = index + 1;
            denominator = k - index;
        }

        System.out.println(numerator + "/" + denominator);
    }
}

 

풀이 과정

1. 대각선 k찾기

while 문을 사용하여 k * (k + 1) / 2 >= X가 될 때까지 k 증가

2. 대각선 내에서 X의 위치 찾기

start = k * (k - 1) / 2 + 1
index = X - start

3. 분수 계산

k가 홀수이면 (k - index) / (index + 1)
k가 짝수이면 (index + 1) / (k - index)

 


✏️ 문제 번호 : 2869
달팽이는 올라가고 싶다

 

문제 살펴보기

 높이 V미터 = length
낮에 올라갈 수 있는 A미터 = up
밤에 미끄러지는 B미터 = down

달팽이가 나무 막대를 모두 올라가는데 걸리는 최소 일수 계산하기

 

정상에 올라간 후에는 미끄러지지 않습니다.

낮에 올라가는 길이와 밤에 내려오는 길이를 단순히 빼서 나눗셈하면 안됩니다!!

up일 때,
나머지 블럭이 남아있다면 하루가 더 소요가 되고

down은 항상 up보다 횟수가 하나 작습니다.

즉, up과 down의 차를 length에서 나누면,
잔여 블록 상관 없이 몫만 반환하게 됩니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
		int up = Integer.parseInt(st.nextToken());
		int down = Integer.parseInt(st.nextToken());
		int length = Integer.parseInt(st.nextToken());
 
		int day = (length - down) / (up - down);
		if ((length - down) % (up - down) != 0)
			day++;
 
		System.out.println(day);
	}
}

 

풀이 과정

1️⃣ 총 올라가야 할 높이에서 마지막 하루를 제외하고 계산

정상에 도착하는 순간에는 더 이상 미끄러지지 않음
따라서 (V - B) 미터만 올라가면 밤에 미끄러지는 것을 고려할 필요 없음

2️⃣ 매일 실제 올라가는 거리 계산

하루에 실제로 올라가는 거리 = (A - B)

3️⃣ 필요한 일수 계산

(V - B) / (A - B) 를 계산하면 며칠이 필요한지 알 수 있음
하지만 나누어 떨어지지 않는 경우, 하루 더 필요함  (V - B) % (A - B) != 0 일 때 +1

 

BufferedReader와 StringTokenizer 사용을 해서 빠른 입출력 처리를 했습니다.


 

이처럼 백준 8단계 문제를 풀어봤습니다.

저는 다음 백준 9단계 약수, 배수와 소수의 문제 풀이로 돌아오겠습니다 ~

 

오코완
(오늘도 코테 공부 완료)

인스타그램 : pettydust