코딩테스트 준비

[Java] 럭키 스트레이트

graph-dev 2023. 6. 1. 17:37
728x90

Java로 풀어보는 간단한 백준 문제 풀이

18406번 럭키 스트레이트 문제입니다.

 

문제 요약

N이라는 점수가 주어질 때, 반으로 나눈 첫번째 자릿수의 합과 나머지 자릿수의 합이 동일해야 합니다.

 

여기서 저는 N이라는 숫자를 받아서, 첫번째 요소와 두번째 요소로 나누어보고자 했습니다. 그러기 위해서 문자열로 변환하고 반으로 나누어 각각의 배열 요소의 합을 구하는 것을 떠올렸습니다.

 

점수 N이 주어지고, 이를 반으로 쪼개어 첫번째 요소의 자릿수 합과 두번째 요소 자릿수 합이 일치하면 “LUCKY”, 아니면 “READY” 출력한다.

 

코드로 살펴보기.

백준에서 코드를 입력할 때, Java의 경우에는 Scanner 패키지를 사용해서 입력값을 받도록 만들어줘야 합니다.

 

1. 먼저 해당 점수를 Scanner로 입력받고, 그 점수의 길이를 저장합니다.

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int len = String.valueOf(N).length();
}

 

2. 문자열로 변환하고, 길이 변수로 반을 나누어(len/2) 그 합을 각각 sum1, sum2 변수에 저장합니다.

String strN = String.valueOf(N);
int sum1 = 0;
int sum2 = 0;

for(int i =0; i<len; i++) {
    if(i < len/2) {
        sum1 += ((int)(strN.charAt(i)) - '0');
    } else {
        sum2 += ((int)(strN.charAt(i)) - '0');
    }

}

 

여기서 ‘0’을 빼줘야 출력했을 때 자릿수 합이 정상적으로 나타납니다. 아스키코드로 변환이 되면서 sum1과 sum2에 잘못된 값이 출력됩니다. 이를 방지합니다.

 

3. if 조건문으로 sum1과 sum2의 값이 동일하면 LUCKY를 출력하고 아니면 READY를 출력하며 스캐너 객체를 닫아서 종료합니다.

if(sum1 == sum2) {
			System.out.println("LUCKY");
		} else {
			System.out.println("READY");
		}
		
		sc.close();

 

전체 코드

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		
		
		int len = String.valueOf(N).length();
		
		String strN = String.valueOf(N);
		int sum1 = 0;
		int sum2 = 0;
		
		for(int i =0; i<len; i++) {
			if(i < len/2) {
				sum1 += ((int)(strN.charAt(i)) - '0');
			} else {
				sum2 += ((int)(strN.charAt(i)) - '0');
			}
			
		}
		if(sum1 == sum2) {
			System.out.println("LUCKY");
		} else {
			System.out.println("READY");
		}
		
		sc.close();

	}

}

 

총평

쉽지만 쉽지 않은 문제이고 문자를 정수형으로 형변환할 때 주의가 필요했습니다. '0'을 빼줘야 아스키코드로 변환된 정수값도 입력한 값 그대로 출력이 됩니다.

 

이 문제는 단순 합의 비교이므로 사실 위 '0' 빼기 과정은 필요없었지만 엄격한 채점을 하게된다면 한번쯤 기억해두시면 좋겠습니다.