관리 메뉴

JIE0025

[구름][난이도1] 의좋은 형제 : 자바(Java) 본문

Algorithm/구름

[구름][난이도1] 의좋은 형제 : 자바(Java)

Kangjieun11 2022. 10. 30. 23:59
728x90

https://level.goorm.io/exam/49088/%EC%9D%98%EC%A2%8B%EC%9D%80-%ED%98%95%EC%A0%9C/quiz/1

구름LEVEL

코딩테스트에서 가장 높은 비중을 차지하는 알고리즘 문제를 제작하고 풀이할 수 있는 온라인 저지 서비스입니다. 기업에서 선호하는 C, C++, 파이썬(Python), 자바(Java), 자바스크립트(Javascript) 이

level.goorm.io






전글과 내용은 같은데, 드디어 자바로 문제를 풀어보게 되어 올리게 되었다.
앞으로는 자바 코딩테스트 대비 학습한 지식들을 함께 올리고자 한다.



문제




✅ 풀이과정

파이썬 풀때와 당연히 동일하게 풀었다.
https://jie0025.tistory.com/230?category=1058752

[구름][난이도1] 의좋은 형제 : 파이썬(python)

https://level.goorm.io/exam/49088/%EC%9D%98%EC%A2%8B%EC%9D%80-%ED%98%95%EC%A0%9C/quiz/1 구름LEVEL 코딩테스트에서 가장 높은 비중을 차지하는 알고리즘 문제를 제작하고 풀이할 수 있는 온라인 저지 서비스..

jie0025.tistory.com



핵심은 다음 두 문장

1. 어떤 사람(one)이 다른 사람(other)에게 식량을 줄 때, 주는 양을 계산하면 다음과 같다.

( one / 2 ) + (one % 2)


2. 즉 어떤 사람(one)에게서 저만큼을 빼주고, 다른 사람(other)에겐 더해주기만 하면 된다.





⏺ 자바의 빠른 입출력

더쉬운 입출력방법 System.out.println(); 이런 애들이 있지만 사실 더 빠른방법이 있다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

import java.io.*;

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String input[] = br.readLine().split(" ");
		int n1,n2;
		
		n1 = Integer.parseInt(input[0]);
		n2 = Integer.parseInt(input[1]);
		
        
		// 본문 내용
        
        
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(String.format("%d %d",n1,n2));
		bw.close();
	}
}


⏺ Java Pair


파이썬에서는 자연스럽게 페어를 return할 수 있었지만, 자바에서는 불가능하다.
따라서 Pair를 만들어주고 사용하면 된다.

Pair

public static class Pair<F,S>{
	F first;
	S second;
	Pair(F first, S second){
		this.first = first;
		this.second = second;
	}
}

- 한가지 유의할 점은 class Main 안에 class를 만들땐 static을 넣어줘야했다는점!

왜 static을 사용해야할까? 일단 졸리니 패스ㅎㅎ (WHY)
(1~2주안에 자바 기본기 갖추고 다시 쓰러 오겠다)

static을 안넣으면 이렇게된다.


🔴 자바에서는...

자바에서는 바로 pair를 리턴하지 못하나…?
모르겠다

위에서 미리 계산하고 pair로 만들어 리턴하기 떄문에,,
파이썬에선 바로 return (one-(one//2 + one%2), other + (one//2 + one%2)) 한줄 코드가 가능했지만

여기에선 미리 계산을 하기 때문에
other계산할 때 위에서 반영된 one이 사용된다..😂😂

(Pair로 바로 보내는방법이 있는지 찾아봐야할듯)
뭔가 p 만들어주고
p(공식 공식) 써주면 될것 같기도 하다

public static Pair<Integer,Integer> divide_remind(Integer one, Integer other){
	one = one - (one/2 + one%2) ;
	other = other + (one/2 + one%2);
		
	Pair<Integer,Integer> p = new Pair<Integer,Integer>(one,other);
	return p;
}



이런 이유로 나누기값과 나머지값을 미리 계산하고 사용했다.

public static Pair<Integer,Integer> divide_remind(Integer one, Integer other){
	int div = one/2;
	int rem = one%2;
	one = one - (div + rem) ;
	other = other + (div + rem);
		
	Pair<Integer,Integer> p = new Pair<Integer,Integer>(one,other);
	return p;
}



✅ 정답 코드

import java.io.*;

class Main {
	public static class Pair<F,S>{
		F first;
		S second;
		Pair(F first, S second){
			this.first = first;
			this.second = second;
		}
	}
	public static Pair<Integer,Integer> divide_remind(Integer one, Integer other){
		int div = one/2;
		int rem = one%2;
		one = one - (div + rem) ;
		other = other + (div + rem);
		
		Pair<Integer,Integer> p = new Pair<Integer,Integer>(one,other);
		return p;
	}
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String input[] = br.readLine().split(" ");
		int n1,n2;
		
		n1 = Integer.parseInt(input[0]);
		n2 = Integer.parseInt(input[1]);
		
		int d = Integer.parseInt(br.readLine());
		Pair<Integer,Integer> now = new Pair<Integer,Integer>(n1,n2);
		for (int i = 1; i<d+1;i++){
			if (i%2 == 1){
				now = divide_remind(n1,n2);
				n1 = now.first;
				n2 = now.second;
			}
			else{
				now = divide_remind(n2,n1);
				n2 = now.first;
				n1 = now.second;
			}
		}
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write(String.format("%d %d",n1,n2));
		bw.close();
	}
}





잘 푼건지는 미지수이지만

제대로 처음 자바로 문제를 풀어본거라 아주 뿌듯하다.

 

 앞으로도 자바로 열심히 풀어야지!!