알고리즘 : 프로그래머스 : JAVA : 핸드폰 번호 가리기

2022. 1. 16. 03:40알고리즘/프로그래머스

반응형

<문제>


class Solution {
  public String solution(String phone_number) {
      String answer = "";

        for (int i = 0; i < phone_number.length() - 4; i++)
            answer += "*";

        answer += phone_number.substring(phone_number.length() - 4);

        return answer;
  }
}

 

class Solution {
  public String solution(String phone_number) {
     char[] ch = phone_number.toCharArray();
     for(int i = 0; i < ch.length - 4; i ++){
         ch[i] = '*';
     }
     return String.valueOf(ch);
  }
}

 

 

<코드 & 설명>

class Solution {
    public String solution(String phone_number) {		 
	StringBuilder answer = new StringBuilder(phone_number);
		 
	for(int i = 0; i < phone_number.length()-4; i++) {
		answer.setCharAt(i, '*');
	}
	return answer.toString();
    }
}

StringBuilder : String 객체를 더할 때 새로운 객체를 생성하는 것이 아니기 때문에 상대적으로 속도도 빠르고 메모리도 효율적으로 이용할 수 있다.

뒷 4자리는 무조건 숫자가 표현되어야 하므로 phone_number.length()-4을 해준다.

StringBuilder의 내장 함수setCharAt(int index, char ch)를 사용하여 주어진 인덱스에 있는 문자를 주어진 문자로 바꿔준다.

StringBuilder는 문자열을 뽑아낼 때 .toString()을 사용한다.


<다른 방법1>

class Solution {
    public String solution(String phone_number) {
        String answer = "";
        String[] a = phone_number.split("");
        for(int i= 0; i<a.length; i++){
            if(i < (a.length-4)) {
                answer += "*";
            } else {
                answer += a[i];
            }
        }
        return answer;
    }
}

1. 핸드폰 번호를 가린 answer 변수를 String 으로 객체 생성
2. split을 사용하여 phone_number을 하나씩 잘라서 a라는 문자열 배열에 저장
3. 총 answer의 길이가 a.length와 동일하기에 for문을 사용
1) i < a.length-4 일 때
- 맨 뒷 자리 4자리수만 빼고 가리면 되기에 "*"을 answer에 추가
2) i < a.length-4 가 아닐 때
- 맨 뒷 자리 4자리 수는 가리면 안 되기에 a[i]에 해당하는 수를 answer에 추가
3. answer를 return을 사용하여 반환


<다른 방법2>

 

(1) string에 계속 문자 추가

class Solution {
    public String solution(String phone_number) {
        int len = phone_number.length();                  // len은 번호의 길이
        String answer = "";
        for (int i=0; i<len; i++) {                       // 번호의 길이만큼 반복
        
            if (i< len-4) {                               // 끝에서 4번째 전까지의 자리에는
                answer += "*";                            // "*"을 추가
                
            } else {                                      // 그 이후에는
                answer += phone_number.substring(i,i+1);  // phone_nuber의 숫자 하나씩 추가
            }
        }
        return answer;
    }
}

(2)  stringbuilder에 계속 문자 추가

class Solution {
    public String solution(String phone_number) {
        int len = phone_number.length();                  // len은 번호의 길이
        StringBuilder sb = new StringBuilder();           // stringbuilder인 sb를 생성
        
        for (int i=0; i<len; i++) {                       // 번호의 길이만큼 반복
        
            if (i< len-4) {                               // 끝에서 4번째 전 까지는
                sb.append("*");                           // "*"을 추가
                
            } else {                                      // 그 이후에는
                sb.append(phone_number.substring(i,i+1)); // phone_number의 숫자 하나씩 추가
            }
        }
        String answer = sb.toString();                    // stringbuilder인 sb를 string으로 변환
        return answer;
    }
}

(1),(2) 설명

:

문자열 answer를 비워둔 값 ""으로 정의하고 for문으로 answer에 *과 전화번호를 추가한다. 번호의 길이를 기준으로 (번호길이-4) 자리까지는 "*"을 추가하고 그 이후로는 substring으로 추출하여 번호 한자리씩 추가한다.

  • 문자열은 +를 이용하여 문자를 추가할 수 있다.
  • stringbuilder는 스트링빌더.append(문자열)로 스트링빌더에 문자열을 추가할 수 있다.
  • string은 크기가 고정되어 있다.(불변) 따라서 기존 객체에 문자를 추가하여 수정하는 것처럼 보여도 실제로는 기존 객체의 크기를 늘릴 수 없기 때문에 새로운 문자열을 계속 만들어내는 것이다.
  • stringbuilder는 크기가 고정되어 있지 않다.(가변) 따라서 기존 객체에 문자를 추가할 수 있고 기존 객체가 수정되는 것이다.
  • stringbuilder처럼 append를 써서 문자를 계속 추가할 수 있는 stingbuffer(가변)가 있는데 두 클래스는 동기화 지원 유무가 다르다고 한다.
반응형