[Java] Stirng 함수와 Luhn 알고리즘 feat.신용카드번호

2024. 10. 4. 02:01Java

오늘은 자료형 String의 다양한 함수,

그리고 우리가 흔히 사용 중인 신용카드 번호에 사용되는 Luhn 알고리즘에 대해 알아보자.

 


 

Quiz

1.   신용카드 번호를 오른쪽에서부터 더하면서 진행한다 (끝에서 부터 시작)

 

2.   2의 배수의 자리에 있는 수는 곱하기 2

      만약, 곱한 수가 10보다 크다면 10의 자리수 + 1의 자리수 의 결과값을 넣는다

3.   전체 숫자가 10의 배수라면  true , 10의 배수가 아니라면 false 

      true 가 되어야 유효한 카드번호이다. 

class Solution {
  public boolean solution(String cardNumber) {
		
	int sum = 0;
		
	// 1) '-' 제거
	String s1 = cardNumber.replace("-", "");
		
		
	// 2) 문자열에서 각 자리의 글자를 계산할 수 있는 숫자로 추출
	for (int i = 0; i < s1.length(); i++) {
	  char ch = s1.charAt(i);		//  char
	  int num = ch - 48;			//  int
			
			
	// 3) 왼쪽부터 index 로 세어도 무방
	   if (i % 2 == 0) {
		num = num * 2;
				
		// 4) 만약 2배한 값이 두자리 수이면 (== 10 이상)
		//	 짝수번째는 2배, 홀수번째는 그대로
		  if (num >= 10) {
			num = num / 10 + num % 10;
		  }
		}
        
		// 5) 16개의 숫자 합계를 구할 변수가 준비되어있어야함
		  sum += num;
		}
		
		//	6) 출력
		System.out.println(sum);
		

		return sum % 10 == 0;	//	결과를 boolean 타입을 쓰기 위해서 
					// return 에 조건을 넣어줌 			
					//  조건이 맞으면 true , 아니면 false
	}
}


public class Luhn {		//	여러 값을 입력하고 
				//	Luhn 함수 형식에 맞게 출력하는 클래스 

	public static void main(String[] args) {
		String input = "1162-3434-1010-2111";		//	유효
		String input2 = "1162-3434-1010-2113";		//	유효하지않음
		
		
		
		Solution s  = new Solution();
		
		System.out.println("input 이 유효한가 : " + s.solution(input));
		System.out.println("input2 이 유효한가 : " + s.solution(input2));
	}

}

 

위 코드에서 사용된 함수들을 정리해보자.

 

1)   replace("변경하고 싶은 값" ,  "변경 후 들어갈 값") 

: 새로운 문자열로 대체한다. 

 

2)   charAt() 

: 문자열을 char 형으로 바꿔준다. 

 

그 밖에도 다른 함수들이 있다.

1) 문자열 더하기
  String str = "Hello," + " world !!";			
  System.out.println(str);
    
  출력 결과는     Hello, world !!
 

2) substring 	:  문자열에 대한 뺄셈	
  System.out.println(str.substring(7));
    //	7번 글자부터 마지막 글자까지 잘라낸다
    //   정수를 하나만 전달하면 beginIndex 라고 인식 	-> 지정한 위치부터 마지막글자를 잘라낸다
  
  출력 결과는	world !!

  System.out.println(str.substring(0, 5));
    //	0 ~ 5번까지 (마지막은 포함 X)
    //	정수를 두개 전달하면 beginIndex ~ endIndex 까지 잘라낸다
    //	이때, endIndex 의 범위는 포함하지 않는다
    
  출력 결과는	Hello
  
  3) 글자의 내용이 일치하는지 확인
  String str2 = new String("Hello, world !!");		//	새로운 공간에 만들어낸 str2 변수 
  System.out.println(str.equals(str2));		
		
  출력 결과는 true
  
		
  //  같은 내용의 글자라도, 비교연산자로는 true 가 나오지 않는다
  System.out.println(str == str2);

  출력 결과는 false
		
        
  문자열 비교방법				
  1) equals : 내용이 일치하는가		2) == : 같은 위치에 있는가
  
  문자열을 비교할때에는 일반적으로   equals 함수를 사용 !!
 

4) A.startsWith(B)	: A문자열이 B 내용으로 시작하는가

5) A.endsWith(B)	: A문자열이 B 내용으로 끝나는가

-> 결과는 boolean 타입으로 나온다
 

6) contains(문자열) : 해당 문자열을 포함하는가 

  String s1 = "a1B2c3D4e5";
  String filter = "abcdefgABCDEFG";
  String s2 = "";
	
		
  for(int i = 0; i < s1.length(); i++) { //	전체 글자 중에
	char ch = s1.charAt(i);		//	각 글자를 ch 라고 가정 
	String s = ch + "";		//	contains 함수에는 문자열을 전달하기 위해서 빈문자열 이용 
	if(filter.contains(s)) {	//	글자가 필터에 포함되면
      s2 += s;				//	새로운 변수에 저장 
    }
   }
   System.out.print("s2 : " + s2);
   
   
   출력 결과는	aBcDe

 


 

String 의 함수를 알기전에는 for 문을 통해서 일일이 문자열에 조건이 만족하는지 찾곤 했는데

함수를 사용하니까 더 수월하게 문제를 풀 수 있었다.

 

더 많은 String 함수들이 있기 때문에 이를 적극 활용하는 것이 좋을 것 같다.