문제풀이(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
'Algorithm > java, kotlin' 카테고리의 다른 글
[백준/Java, Kotlin] 2096번 내려가기 (2) | 2024.09.02 |
---|---|
[백준/Java, Kotlin] 18114번 블랙 프라이데이 (1) | 2024.08.29 |
[백준/Java, Kotlin] 1806번 부분합 (0) | 2024.08.22 |
[백준/Java, Kotlin] 2531번 회전 초밥 (0) | 2024.08.22 |
[프로그래머스/Java, Kotlin] 옹알이 (2) (Lv. 1) (0) | 2024.06.21 |