[백준-Java] 기본수학 1 다시풀기(1, 7, 9번)

RedPanda·2021년 10월 1일
0

[알고리즘] Java

목록 보기
11/16

백만년만의 포스팅이다.
추석에 펑펑 놀고 다시 공부하려니 정말 싫어서 질질 끌었다...
문제도 이 파트(기본수학 1) 마지막 문제라서 그런지 어려웠다. 저어어엉말 하기 싫을 정도로...ㅎㅎㅎ

오늘은 기존에 다시 풀어야 했던 문제 + 1011번을 포스팅 하겠다.

1712번) 손익분기점

'노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.'

이 부분만으로 알아 볼 수 있는 것은 N대 생산한다고 가정했을 때,
[고정비용 + N * 가변비용 > 판매비용] 일때 손익분기점을 넘긴다고 할 수 있다.

따라서 이 조건을 기준으로 풀면 간단하게 풀 수 있는 문제이다.
주의할 점은 손익분기점을 넘겨야 하기 때문에 1을 더해줘야 한다는 점이다.

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String ABC = br.readLine();
        int A = Integer.parseInt(ABC.split(" ")[0]);
        int B = Integer.parseInt(ABC.split(" ")[1]);
        int C = Integer.parseInt(ABC.split(" ")[2]);

        if(B>=C){
            System.out.println(-1);
            System.exit(0);
        }

        System.out.println(A/(C-B)+1);
    }
}

처음에 풀 때 +1을 안해줘서 고통받았던 기억이 난다.

2839번) 설탕배달

포인트는 두가지이다.

  1. 3킬로그램 봉지와 5킬로그램 봉지가 있다.
  2. 최대한 적은 봉지를 가지고 배달하려 한다.
    (ex. 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.)

우선 순서를 정해서 풀어보았다. 5로 나누는 것이 3으로 나누는 것보다 적은 봉지를 만들어낼 수 있다고 생각하여 5로 나눠질 때 까지 나누는 것을 우선순위 조건으로 두고 풀었다.
하지만 11의 경우에 5 - 3 - 3이 아니라 5 - 5 - 1로 나눠지는 일이 발생하여 예외인 -1을 출력해버렸다.

그래서 5로 가장 많이 나누면서 3을 나눌 수 있는 방법을 생각해봤다.

<while(candy%5 != 0) candy = candy-3;>

  1. 5로 나눠지는 경우 : 반복문에서 빠져나가 다음 코드를 실행.
  2. 3으로 나눠지는 경우 : 다 나누고 빠져나간다.
  3. 3으로 나눴는데 5를 못만난 경우 : candy는 음수가 되어 빠져나간다.

1과 2의 경우, 앞의 조건에 충족되는 경우에는 빠져나가고 다음 코드를 실행하여 문제없이 결과를 도출한다.
3의 경우에는 candy가 음수가 되었으므로 예외로 처리한다.

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int candy = Integer.parseInt(br.readLine());
        int result = 0;
        while(candy%5 != 0){
            candy = candy-3;
            result++;
        }
        if(candy<0){
            System.out.println(-1);
            System.exit(0);
        }
        result += candy / 5;

        System.out.println(result);
    }
}

1011번) Fly me to the Alpha Centauri

대망의 마지막 문제이다. 1011번을 처음 접했을때 골드 티어라서 한 번 겁먹고 사진을 보고 두 번 겁먹었다.
문제 자체도 생각을 많이 해봐야 하는 문제였다.

우선 다 해봤다. 1~20까지 하나하나 다 써보았다.
이 과정에서 약간의 규칙을 발견했다.

(진짜 엑셀이랑 워드 안되는거 너무 서럽다아아아 ㅠㅠㅠㅠㅠ)

  • distance는 Y-X값이다.
  • max는 거리 중의 가장 큰 값이다.
  • count는 넘어가는 번 수이다.

이 전제 하에 문제를 풀어보자.

1) 우선, count 값이 바뀔 때는 두 가지이며 그 중 하나는 max값이 바뀔 때이다.
이 경우에 'distance = max^2, count = 2*max-1' 이 성립한다.

2) 다음 바뀌는 조건은 찾기가 쉽지 않다.
우선, 이전 조건을 기준으로 봤을때 다음으로 바뀌는 경우는 max만큼 거리를 갔을 때이다.
따라서, 'max^2 < distance < max^2 + max' 이 성립한다.
이 조건에서의 count는 2max이다.
3) 자, 나머지는 else로 해결하자. 이때의 count는 2
max+1이다.

결국, 두번째 조건을 기준으로 count가 결정되는 문제라고 할 수 있다.

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

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++) {
            String XY = br.readLine();
            int x = Integer.parseInt(XY.split(" ")[0]);
            int y = Integer.parseInt(XY.split(" ")[1]);
            int distance = y - x;
            int n = 0;
            int result = 0;
            
            int max = (int)Math.sqrt(distance);
            
            if(max == Math.sqrt(distance))
                result = 2*max -1;
            else if(max*max<distance && max*max+max >= distance){
                result = max*2;
            }
            else result = max*2 +1;
            System.out.println(result);
        }
    }
}

물론 시간도 많이 쓰고 여러 조건을 기준으로 시도는 해봤다.
하지만 반복문에서 시간초과가 걸리고 인내심의 한계가 와서 결국 찾아봤다.
근데 더 큰 문제는 이해도 어려웠다는 것이다.

이런 문제는 복기하면서 나중에 맨땅에 헤딩하듯 다시 풀어보는게 중요하다 생각한다.

profile
끄적끄적 코딩일기

0개의 댓글