일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 혼술 술자리 인싸앱
- 패스트캠퍼스
- 불끌때
- 내일배움카드
- 안녕 디지몬
- 안드로이드
- Ai
- 스쿼드 메이커
- 안드로이드 그림판#그림메모장#낙서장
- 피온4
- 랜덤스쿼드
- 아두이노#작품#사료급식기
- 부르지마세요
- 안드로이드 #앱개발#계산기
- 부의감각
- 박스#강아지집#만들기
- 강아지 #박스집 #복층
- #FIFAONLINE4
- fifaonline4
- Java & SpringBoot로 시작하는 웹 프로그래밍
- 랜덤
- 자바 인강
- 바이트디그리
- 강아지 스마트 펜스
- 안드로이드#앱만들기#알바
- D-ID
- 홈CCTV
- 독서감상문
- fifaonline
- K디지털크레딧
- Today
- Total
LC Studio
백준 2869 달팽이는 올라가고 싶다 (JAVA) 본문
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
별로 어렵지 않아 보이는 문제이지만,
시간제한이 0.15 초 (추가 시간 없음)이기 때문에 출력을 최대한 빨리해야한다.
그래서 BufferedReader와 BufferedWriter을 활용해줬다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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());
br.close();
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while(true){
if(V <= (A*i)-(B*(i-1))){
String string = Integer.toString(i);
bw.write(string);
bw.flush();
bw.close();
break;
}
else{
i++;
}
}
}
}
A,B,V를 입력받아 i번의 횟수를 중심으로 식을 작성했다.
하지만 시간초과가 나왔다... Buffered를 활용하는 것만으로는 부족했나보다.
1712번 손익분기점 문제를 풀었을때를 되돌아보았다.
그때 반복문을 쓰지않고 식을 세워 문제를 해결하는 방법을 배웠었다.
이번 문제에 적용해 보았다.
V(높이)
A(올라가는 높이)
B(내려가는 높이)
i(날짜)
높이가 같아질때를 기준으로 식을 세워보았다.
(높이) = (올라가는 높이 * 날짜) - (내려가는 높이 * (날짜 - 1))
//날짜 -1을 한 이유는, 문제에서 정상에 올라간 후에는 미끄러지지 않는다고 했기 때문에 해주었다.
V = (A*i) - (B*(i-1))
V = (A*i) - (B*i - B)
V = (A-B)*i +B
V-B = i(A-B)
(V-B)/(A-B) = i
위와 같은 식으로 i를 구할 수 있다.
다만, 정수로 딱 나눠떨어지지 않는 경우에는 날짜에 +1을 해주어야 한다.
왜냐하면 1.5, 1.6 등의 날짜가 나오면 0.5, 0.6도 우리는 하나라고 치기 때문이다.
코드를 작성해보면->
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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());
br.close();
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
/*
while(true){
if(V <= (A*i)-(B*(i-1))){
String string = Integer.toString(i);
bw.write(string);
bw.flush();
bw.close();
break;
}
else{
i++;
}
}
*/
if((double)(V-B)/(A-B) == (V-B)/(A-B)){ //정수로 딱 나눠질경우
String string = Integer.toString((V-B)/(A-B));
bw.write(string);
bw.flush();
bw.close();
}
else{//나머지가 생길경우
String string = Integer.toString((V-B)/(A-B)+1);
bw.write(string);
bw.flush();
bw.close();
}
}
}
위와같이 하면 된다! 정답!
'Java > 백준 알고리즘' 카테고리의 다른 글
백준 2775 부녀회장이 될테야 (JAVA) (0) | 2022.03.20 |
---|---|
백준 10250 ACM 호텔 (JAVA) (0) | 2022.03.20 |
백준 2941 크로아티아 알파벳 (Java) (0) | 2022.03.18 |
백준 2908번 상수 (JAVA) (0) | 2022.03.17 |
백준 1157 단어공부 (Java) (0) | 2022.03.17 |