today_is

[ String ] Luhn 알고리즘 & string 함수 본문

java

[ String ] Luhn 알고리즘 & string 함수

ye_rang 2023. 11. 22. 14:43

오늘의 목표 >> 

자료형 String 은 다양한 함수를 사용할 수 있다.

 

여러 함수를 사용해볼 수 있도록 

카드번호가 유효한지에 대해 판단할 수 있는 Luhn 알고리즘에 대해서 알아보자 !

 


문제 >> 

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

 


study_review >>

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

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

 

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

 

항상 편리하게 코드를 작성하는 법에 대해서 찾아보자!