본문 바로가기

Coding Test

(CodingTest) : 26일차 한 번만 등장한 문자

 

 

☑️ 정답1 (아래에 더 나은 방법으로 풀기)

체크 부분

    1) cnt = 0이라는 변수를 둬서, 중복되는 값이 있다면 cnt를 +1씩 늘려주기

    2) 그리고 cnt가 1인 경우는 값이 딱 1개만 있다는 의미니, 해당 값에 해당하는 값을 answer에 추가하기

    3) 정렬을 우선 해주고 시작하는게 좋음

// cnt=0을 사용해서, 만약 동일 값이 있다면 +1해주고, 없다면 아무 작업 안 하도록
// cnt가 1이라면, 자기 자신만 있다는 의미라서, 해당 값을 answer에 추가해주기

import java.util.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        String[] arr = s.split("");
        Arrays.sort(arr);
        
        for(int i = 0; i < arr.length; i++){
            int cnt = 0;
            for(int j = 0; j < arr.length; j++){
                if(arr[i].equals(arr[j])){
                    cnt += 1;
                }
            } 
            if(cnt == 1){
                answer += arr[i];
            }
        }
        return answer;
    }
}

 

 

☑️ 정답2 (더 나은 방법)

 체크  부분

   1) map.getOrDefault(a,b); --> map에서 a라는 key값이 있으면 a를 반환, 없다면 b를 반환

   2) 문자열 결합이 많은 경우는 StringBuilder사용하기

       (answer += b의 방식보다 1.메모리 낭비 적음 2. 속도 빠름,시간 복잡도 낮음)

   3)  if(map.get(b) == 1){ sb.append(b); } 이 부분에서 b == 1이 아니라, map의 value값이 1인걸 찾아야 함 

import java.util.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        String[] arr = s.split("");
        Arrays.sort(arr); // 사전순 정렬
        
        Map<String, Integer> map = new HashMap<>();
        
        for(String a : arr){
            map.put(a, map.getOrDefault(a,0) + 1); // a가 있으면 기존 값+1, 없으면 0+1
        }
        
        StringBuilder sb = new StringBuilder();
        for(String b : arr){
            if(map.get(b) == 1){
                sb.append(b);
            }
        }
        return sb.toString();
    }
}