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

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

by son_i 2023. 4. 14.
728x90

전형적인 어릴 때 많이 보던 수학문제 !

를 코딩으로 하게 됐당... 쉬워보이지만 시간이 상당히 짧아서 뭔가 방법을 찾아야할 것 같다.

 

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

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 A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		int V = Integer.parseInt(st.nextToken());

		int current = 0; //달팽이의 현위치
		int day = 1;
		while(true) {
			if(current <V) {
				current += A; //A만큼 올라가고
				if(current >=V)
					break;
				else
					day++;
				current-=B; //B만큼 미끄러짐
			}
		}
		System.out.println(day);
	}
}

완전 간단히 풀었지만 시간초과가 나왔따 ㅋㅋ

이것도 역으로 생각하는 방법 ? .. 음 흐음 ..

마지막 높이를 딱 찍어놓고 

올라가는 높이 A - 미끄러지는 높이 B를 해서 몇 번이나 쌍으로 필요한지를 day에 더해넣고

모자른 거 A로 더하고 day하나 더 추가 !

 

그러다 갑자기 이진탐색을 해야되는게 생각났따 !

package algorithm;

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

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 A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		int V = Integer.parseInt(st.nextToken());

		
		
		//이진탐색 ?!?!?!?!?
		int high = V-A;
		int low = 0;
		int mid = 0;
		int result = V;
		while(low<=high) {
			mid = (high+low)/2;
			
				if(mid*(A-B) >=V) 
					high = mid -1;
				else {//올라갔는데 아직 길이가 모잘르긴해
					if(mid*(A-B)+B >=V) { //B를 빼지않았을 때 안 모잘라지면 그냥 그대로 끝
						break;
					}
					else { //B까지 빼봤는데도 여전히 모자르다면
						if(V-mid*(A-B) <=A) { //모자르긴 한데 A로 한 번 커버가 가능하면
							mid += 1;
							break;
						}
						else //커버 안 되면 수 높여서 다시 연산
							low = mid+1;
					}
				}
		}
		System.out.println(mid);
	}
}

완성해서 예제 잘 나오고 문제도 돌아가는데 틀렸대 ~~~~ 왜일까 ~~~

자료형인가 싶어서 고쳐봤는데 틀렸당 26퍼에

 

일단 이 코드 질문 남겨놨다

글 읽기 - 26%에서 틀렸다고 나옵니다. 혹시 반례를 알려주실 수 있나요? (acmicpc.net)

 

글 읽기 - 26%에서 틀렸다고 나옵니다. 혹시 반례를 알려주실 수 있나요?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

package algorithm;

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

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 A = Integer.parseInt(st.nextToken());
		int B = Integer.parseInt(st.nextToken());
		int V = Integer.parseInt(st.nextToken());

		int count = 0;
		
		count = (V-B)/(A-B);
		
		if((V-B)%(A-B) != 0) {
			count++;
		}
		System.out.println(count);
	}
}

결국은 요렇게 풀었는디...

왜 이진탐색으로 안 되는 거지 ?!?!?!

728x90

'알고리즘 > 백준' 카테고리의 다른 글

10926번 문제 : ??!  (0) 2023.04.15
4949번 문제 : 균형잡힌 세상  (0) 2023.04.15
2805번 문제 : 나무 자르기  (0) 2023.04.11
2798번 문제 : 블랙잭  (0) 2023.04.03
2775번 문제 : 부녀회장이 될테야  (0) 2023.04.02