hahn

[백준 - JAVA] 부호 본문

코딩테스트 연습/백준(JAVA)

[백준 - JAVA] 부호

hahn 2021. 9. 15. 12:21
728x90
반응형

1247번: 부호 (acmicpc.net)

 

1247번: 부호

총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1≤N≤100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거나

www.acmicpc.net

http://boj.kr/dd8d97ca1e0f4ae98f2d92bbca350e69

 

공유 소스 보기

 

www.acmicpc.net

더보기
import java.util.Scanner;

class Main{
    
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
		
		int testSetCount, roundedNumber;
		
		long sum, inputNumber;
		
		for(int i = 0; i < 3; i++) {
			
			testSetCount = sc.nextInt();
			
			sum = 0;
			roundedNumber = 0;
            
			for(int j = 0; j < testSetCount; j++) {
				
				inputNumber = sc.nextLong();
				
				if((sum < 0 && inputNumber < 0) && (sum + inputNumber > 0)) {
					
					roundedNumber--;
					sum = sum + 9223372036854775807L + inputNumber;
					
				}else if((sum > 0 && inputNumber > 0) && (sum + inputNumber < 0)){
					
					roundedNumber++;
					sum = sum - 9223372036854775807L + inputNumber;
					
							
				}else {
					
					sum += inputNumber;
					
				}
				
			}
			
			if(sum <= -9223372036854775807L) {
				roundedNumber--;
				sum = sum + 9223372036854775807L;
			}
			
			if(roundedNumber == 0 && sum == 0 || (sum == 9223372036854775807L && roundedNumber == -1)) {
				
				System.out.println(0);
				
			}else if(roundedNumber > 0 || (roundedNumber == 0 && sum > 0)) {
				
				System.out.println("+");
				
			}else {
				
				System.out.println("-");
				
			}
			
		}
        
    }
    
}

여기서 이렇게 많이 틀릴 줄 몰랐다..

 

그래도 덕분에 많은 개념을 얻었다.

 

일단 범위를 벗어나는 연산을 하기 위해서

 

올림수 부분을 만들어줬다.

 

for(int j = 0; j < testSetCount; j++) {
	
	inputNumber = sc.nextLong();
	
	if((sum < 0 && inputNumber < 0) && (sum + inputNumber > 0)) {
		
		roundedNumber--;
		sum = sum + 9223372036854775807L + inputNumber;
		
	}else if((sum > 0 && inputNumber > 0) && (sum + inputNumber < 0)){
		
		roundedNumber++;
		sum = sum - 9223372036854775807L + inputNumber;
		
				
	}else {
		
		sum += inputNumber;
		
	}
	
}

올림 내림 부분을 이렇게 구현한 뒤,

if(sum <= -9223372036854775807L) {
	roundedNumber--;
	sum = sum + 9223372036854775807L;
}

if(roundedNumber == 0 && sum == 0 || (sum == 9223372036854775807L && roundedNumber == -1)) {
	
	System.out.println(0);
	
}else if(roundedNumber > 0 || (roundedNumber == 0 && sum > 0)) {
	
	System.out.println("+");
	
}else {
	
	System.out.println("-");
	
}

조건 처리를 이렇게 했는데

 

여기를 수정하는 게 되게 애 먹었다.

 

if(sum <= -9223372036854775807L) {
	roundedNumber--;
	sum = sum + 9223372036854775807L;
}

이 부분이 되게 중요한데

 

숫자 값의 범위는 0 때문에 양수 부분이

 

음수보다 1적다 그래서

 

sum이 9223372036854775808L,

 

roundedNumber이 1이 되는 경우에는 오답을 출력한다.

 

그래서 

 

sum = sum - 9223372036854775807L + inputNumber; 이 부분을 역 이용하여

 

sum = sum + 9223372036854775807L;

 

이걸 넣어줬는데

 

처음에는 음의 정수 가장 작은 값이

 

9223372036854775808L니까

 

sum = sum + 9223372036854775807L + 1;을 넣었는데

 

앞에서 내가 내림을 정의할 때 9223372036854775807L을 더하는 걸로 했기에

 

다른 케이스에서 오답을 출력한다..

 

암튼 다 수정해서 넣었더니 통과했다.

 

정리하자면

 

숫자 값의 범위는 최솟값이 최댓값보다 1이 더 많다는거고,

 

오버플로우에 대해 올림 내림을 정의했으면 그에 따라 코드를 작성해야 한다.

 

(올림 내림 정의는 반대의 연산을 해줘야 하므로 최댓값 기준으로 잡는 게 좋다.

 

ex. 내림에서 sum = sum + 9223372036854775808L + inputNumber;

 

밑줄 부분이 불가능하기 때문에 물론 방법은 있지만 이게 더 보기 좋다.)

 

난도가 낮은 문제에서 되게 많이 틀려 기분이 상하지만

 

많이 얻었다.

728x90
반응형

'코딩테스트 연습 > 백준(JAVA)' 카테고리의 다른 글

[백준 - JAVA] 모음의 개수  (0) 2021.09.15
[백준 - JAVA] 이진수 덧셈  (0) 2021.09.15
[백준 - JAVA] 성지키기  (0) 2021.09.15
[백준 - JAVA] 이상한 곱셈  (0) 2021.09.15
[백준 - JAVA] 8진수 2진수  (0) 2021.09.15