[프로그래머스] 평균 구하기, 핸드폰 번호 가리기

박채은·2023년 4월 13일
0

코딩테스트

목록 보기
16/52
  • Notion에 진행 상황 정리
  • 하루에 2 문제씩 문제 풀기
  • 알고리즘 문제 하나 + 풀고 싶은 문제 하나
  • 최대한 고민해서 풀어보고 1시간이 넘어가면 해설 보고 풀기
  • 인텔리제이 사용하지 않고 풀기!

1. 평균 구하기

풀이과정

import java.util.Arrays;

class Solution {
    public double solution(int[] arr) {
       double answer = 0;
        for(int i: arr){
            answer +=i;
        }
        return answer/arr.length;
    }
}

stream을 사용해서 풀고 싶었는데, 라이브러리를 사용하면 안 될까봐 import하지 않고 for-each 문으로 풀었다.
하지만 다른 사람들의 풀이를 보니까 import java.util.Arrays;를 하신 분들이 많았다.(사용할 수 있는 거였군!)

배운 점

1. 라이브러리를 사용하고 싶으면 import 해서 사용하자. 하지만 오히려 속도가 느릴 수 있다.

  • stream을 사용했을 때, 코드는 간결해지나 속도가 엄청나게 느려졌다.
  • 문제마다 라이브러리를 사용하는 것이 성능에 좋을지에 대한 고민이 필요할 것 같다.

2. 예외 처리에 좀 더 주의를 기울이자!

  • if(arr == null || arr.length == 0) return 0;을 추가했다.
  • 이 문제에서는 성능에 큰 차이는 없지만, 예외 처리 한 것과 안 한 것에 성능 차이가 많이나는 경우가 있기 때문에 예외 처리를 꼭 해주자!


2. 핸드폰 번호 가리기

풀이 과정

  • *repeat()을 사용해서 반복해주고, 나머지 뒤의 4 문자는 반복문을 통해서 추가해주었다.
  • 생각보다 속도가 느리게 나와서 속도를 개선할 방법을 보고자 했다.

성능 개선

(1) substring 사용

//  원래 코드
for(int i = len-4;i<len;i++){
   answer += phone_number.charAt(i);
}

// 수정한 코드
answer += phone_number.substring(len-4);
// 개선된 코드
class Solution {
    public String solution(String phone_number) {
        String answer = "";
        int len = phone_number.length();
        
        answer += "*".repeat(len - 4);
        answer += phone_number.substring(len-4);
        return answer;
    }
}

  • 속도가 10분의 1 정도로 줄었다!

(2) toCharArray() 사용

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);
  }
}

  • 속도가 가장 빨랐다.

배운 점

1. length() vs final size

String을 순회하다보면 for문에 length()를 넣어둘지, final size로 크기를 고정시켜두고 순회를 시작할지 고민하게 된다.
나는 보통 for문에 넣는 편이고, 문제에 따라 자주 사용되는 변수라고 판단되면 따로 final size로 고정시켜둔다.

결론부터 말하면, 크게 차이는 없지만 final size로 고정시켜둔 경우가 다 빠르다고 한다. 생각해보면 당연하긴 한데 이런 사소한 부분도 알고 있으면 조금이나마 도움이 되지 않을까 싶다!

2. charAt() vs toCharArray()

String을 파싱할 때, charAt()을 사용해서 String의 해당 위치에 있는 문자를 가져와야하는가? 아니면 toCharArray()을 통해서 character 배열로 만들어둔 다음에 배열의 인덱스로 순회해야하는가?

  • charAt(): String은 결국 character의 배열이다!
    String 객체 내부에는 value라는 배열이 있는데 그 배열에서 해당 인덱스 값을 가져오는 메서드이다.

  • toCharArray(): 배열을 새롭게 생성하기 때문에 이때 비용이 크게 발생한다.

길이가 긴 String의 경우에는 charAt()을 사용하는 것이 좋다. 만약 해당 String을 여러 번 순회에 사용해야 한다면, toCharArray()를 사용해서 배열로 만들어두고 순회를 하는 것이 효율적일 수도 있지만 아니라면 charAt()을 사용하자!

자세한 내용은 이 블로그에 잘 정리되어 있다.

0개의 댓글