뽀미의 개발노트

백준 2869 달팽이는 올라가고 싶다 본문

Algorithm_Test

백준 2869 달팽이는 올라가고 싶다

산타는 뽀미 2023. 3. 15. 21:13

A : 올라가는 거리
B : 내려오는 거리
V : 막대기 총 길이

하루 : 밤 + 낮 (-B +A)

2 1 5
+2/(-1 +2)*3번 이렇게 되므로 4일 걸림

5 1 6 
+5/(-1 +5)*1번 이렇게 되므로 2일 걸림

100 99 1000000000
+100/(-99 +100)*999999900번 이므로 999999901일 걸림

5 1 22


걸리는 날 수 = V-A를 A-B로 나눈 몫 + 1임
만약 저 몫이 자연수면 그대로 쓰고 소수점 나오면 올림 해줘야함!

몫이 자연수면 : 나머지가 0이다
아니면 : 나머지가 0이 아니다


- 자바의 Scanner와 System.out.println은 시간이 매우느리다!! 시간초과를 막기 위해서 BufferedReader와 BufferedWriter를 쓰는게 시간이 단축된다.
- BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
- 근데 BR은 입력한걸 문자열로밖에 못 받는다!!
- 그리고 public static void main(String[] args) throws IOException { 이렇게 main 함수 옆에 throws IOException을 해줘야된다!!
- 숫자를 받으려면 바꿔줘야되고, 그리고 한줄당 하나씩밖에 못 받아서 StringTokenizer로 잘라줘야한다.
- StringTokenizer st = new StringTokenizer(bf.readLine()); 이렇게 한 뒤
- int A = Integer.parseInt(st.nextToken());
- int B = Integer.parseInt(st.nextToken());
- int V = Integer.parseInt(st.nextToken());
- 이렇게 써줘야 한줄에 세개를 정수로 받을 수가 있다.
- BW 또한 문자열밖에 출력을 못해서 정수는 문자열로 바꾸고 출력해야한다.
- String str = Integer.toString(i);
- bw.write(str);
- bw.flush();
- bw.close();
- 콘솔창에 출력후 남아있는걸 다 날려주고(flush) 닫아주는(close) 과정이 필요하다.
- 그런데도 시간초과가 떴네....ㅠㅠ
- 버퍼를 쓰고 말고의 문제가 아니었음!! 반복문을 돌며 달팽이가 막대기를 올라갈때마다 i를 하나씩 올린다면 i가 엄청엄청 커질 수도 있어서 시간초과 뜬 거였음!!
- 그래서 V-A를 A-B로 나눈 몫에 +1한거 출력했더니 드디어 통과했음!!
- Scanner쓴게 코드는 짧지만 BufferedReader 쓴거보다 시간 훨씬 길게 나옴!!
- 저 몫이 자연수일때랑 아닐때 나눠서 풀었음
- 다른 사람들도 비슷하게 품!!

 

 


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 bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

StringTokenizer st = new StringTokenizer(bf.readLine());

int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());

int distance_after_firstday = V-A;
int distance_per_day = A-B;
int days;

if(distance_after_firstday % distance_per_day == 0) {
days = distance_after_firstday / distance_per_day + 1;
}
else {
days = distance_after_firstday / distance_per_day + 2;
}

String str = Integer.toString(days);
bw.write(str);
bw.flush();
bw.close();
}
}

'Algorithm_Test' 카테고리의 다른 글

sw 1961. 숫자 배열 회전 (자바)  (1) 2023.08.11
sw 1940. 가랏! RC카! (자바)  (1) 2023.08.06
sw 1989. 초심자의 회문검사 (자바)  (0) 2023.08.04
백준 10250 ACM 호텔  (3) 2023.03.15
백준 2292 벌집  (1) 2023.03.15