Algorithm/java, kotlin

[백준/Java, Kotlin] 1484번 다이어트

나연쓰 2024. 9. 24. 13:19

 

 

 

 

 

문제풀이(Java만 풀이)

문제의 핵심은 합차 공식을 이용하는 것이다.

 

문제에서 주어진

G킬로그램은 성원이의 현재 몸무게의 제곱에서 성원이가 기억하고 있던 몸무게의 제곱을 뺀 것이다.

를 식으로 나타내면 위의 합차 공식과 동일하다.

 

그래서 (현재 몸무게 + 기억 몸무게) (현재 몸무게 - 기억 몸무게) = G가 된다면 현재 몸무게로 하다.

 

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());

int G = Integer.parseInt(st.nextToken());
ArrayList<Integer> al = new ArrayList<Integer>();

1. 문제에서 주어진 G를 입력 받는다.

그리고 몸무게 결과를 담기 위해 arraylist를 생성한다.

 

int start = 1; //기억하는 몸무게
int end = 2; //현재 몸무게

2. 두  포인터로 풀어야하는 문제이기 때문에 기억하는 몸무게를 start로 두고, 현재 몸무게를 end로 뒀다.

기억하는 몸무게 < 현재 몸무게 여야하기 때문에 !

 

while(start < end && end <= G) {
    if((end + start) * (end - start) == G) {
        al.add(end);
        start++;
        end++;
    }else if((end + start) * (end - start) > G) {
        start++;
    }else {
        end++;
    }
}

3. while문을 실행할 수 있는 조건은 start < end 이고 동시에 end는 G 이상 넘으면 안 된다.

그리고 합차공식을 이용해서 start와 end의 합차의 곱이 G라면 가능한 몸무게이므로 리스트에 넣어주고,

현재 start, end는 판별을 했기 때문에 둘 다 +1을 한다.

만약 합차의 곱이 G보다 크다면 start를 +1 하고, 작다면 end를 +1 해준다.

 

Collections.sort(al);

4. 오름차순으로 출력해야하기 때문에 정렬을 한다.

 

if(al.size() == 0) {
    System.out.println(-1);
}else {
    for(int num: al) {
        System.out.println(num);
    }			
}

5. 만약 리스트의 사이즈가 0이라면 가능한 몸무게가 없다는 뜻이므로 -1을 출력하고,

0이 아니라면 리스트의 값을 하나씩 출력한다.

 

 

 

코드

  • Java 코드
public class Main {
	public static void main(String[] args) throws IOException {	
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		
		int G = Integer.parseInt(st.nextToken());
		ArrayList<Integer> al = new ArrayList<Integer>();

		int start = 1; //기억하는 몸무게
		int end = 2; //현재 몸무게
		
		while(start < end && end <= G) {
			if((end + start) * (end - start) == G) {
				al.add(end);
				start++;
				end++;
			}else if((end + start) * (end - start) > G) {
				start++;
			}else {
				end++;
			}
		}
		Collections.sort(al);
		
		if(al.size() == 0) {
			System.out.println(-1);
		}else {
			for(int num: al) {
				System.out.println(num);
			}			
		}
	}
}
  • Kotlin 코드
fun main(){
    var G = readln().toInt()
    var array = arrayListOf<Int>()

    var start = 1
    var end = 2

    while(start < end && end <= G){
        if((end+start) * (end-start) == G){
            array.add(end)
            start++
            end++
        }else if((end+start) * (end-start) > G){
            start++
        }else{
            end++
        }
    }

    if(array.size == 0){
        println(-1)
    }else{
        for(n in array){
            println(n)
        }
    }
}

 

https://www.acmicpc.net/problem/1484