today_is
[ String ] Luhn 알고리즘 & string 함수 본문
오늘의 목표 >>
자료형 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 함수들이 있기 때문에 이를 적극활용하는 것이 좋을 것 같다
항상 편리하게 코드를 작성하는 법에 대해서 찾아보자!
'java' 카테고리의 다른 글
[ for ] 별찍기 (0) | 2023.11.30 |
---|---|
[ 프로그래머스 java ] 신규 아이디 추천 (Lv.1) (0) | 2023.11.27 |
[ loop ] for, while 반복문 (0) | 2023.11.20 |
[ control ] if ~ else , switch case (0) | 2023.11.17 |
[ array ] 중복 제거한 난수 생성하기 (로또번호 추첨) (0) | 2023.11.16 |