백만년만의 포스팅이다.
추석에 펑펑 놀고 다시 공부하려니 정말 싫어서 질질 끌었다...
문제도 이 파트(기본수학 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번) 설탕배달
포인트는 두가지이다.
우선 순서를 정해서 풀어보았다. 5로 나누는 것이 3으로 나누는 것보다 적은 봉지를 만들어낼 수 있다고 생각하여 5로 나눠질 때 까지 나누는 것을 우선순위 조건으로 두고 풀었다.
하지만 11의 경우에 5 - 3 - 3이 아니라 5 - 5 - 1로 나눠지는 일이 발생하여 예외인 -1을 출력해버렸다.
그래서 5로 가장 많이 나누면서 3을 나눌 수 있는 방법을 생각해봤다.
<while(candy%5 != 0) candy = candy-3;>
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까지 하나하나 다 써보았다.
이 과정에서 약간의 규칙을 발견했다.
(진짜 엑셀이랑 워드 안되는거 너무 서럽다아아아 ㅠㅠㅠㅠㅠ)
이 전제 하에 문제를 풀어보자.
1) 우선, count 값이 바뀔 때는 두 가지이며 그 중 하나는 max값이 바뀔 때이다.
이 경우에 'distance = max^2, count = 2*max-1' 이 성립한다.
2) 다음 바뀌는 조건은 찾기가 쉽지 않다.
우선, 이전 조건을 기준으로 봤을때 다음으로 바뀌는 경우는 max만큼 거리를 갔을 때이다.
따라서, 'max^2 < distance < max^2 + max' 이 성립한다.
이 조건에서의 count는 2max이다.
3) 자, 나머지는 else로 해결하자. 이때의 count는 2max+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);
}
}
}
물론 시간도 많이 쓰고 여러 조건을 기준으로 시도는 해봤다.
하지만 반복문에서 시간초과가 걸리고 인내심의 한계가 와서 결국 찾아봤다.
근데 더 큰 문제는 이해도 어려웠다는 것이다.
이런 문제는 복기하면서 나중에 맨땅에 헤딩하듯 다시 풀어보는게 중요하다 생각한다.