[프로그래머스/JAVA] Lv.0 한 번만 등장한 문자

또치·2023년 1월 22일
0

프로그래머스 JAVA

목록 보기
8/20
post-thumbnail

한 번만 등장한 문자


🎢 기억하고 싶은 부분

결국 안썼지만 새롭게 해본것들
  1. List 정렬하는 방법

    • 오름차순
      list.sort(Comparator.naturalOrder())
    • 내림차순
      list.sort(Comparator.reverseOrder())
  2. stream 사용해서 list-> String 변환

    stream.collect( )
    collect()는 Stream의 데이터 변형 등의 처리를 하고 원하는 자료형으로 변환해 준다.
    그 중에서도 Collectors.joining()을 사용하면 stream의 모든 요소들을 1개의 String 객체로 변환해준다.

     answer=list.stream().map(n->String.valueOf(n)).collect(Collectors.joining());

    위에서 map 까지 사용한 이유는 내가 이때 만든 list가 character로 되어있어서 일단 map으로 String으로 변환해준 다음에 collect를 사용했다.

  3. 문자열 정렬 방법

    배열로 변형시켜주고 sort한 아이를 다시 new String으로 만들어주기

    	char[] array=a.toCharArray();
        Arrays.sort(array);
        answer=new String(array);

🎯 문제

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

<제한사항>
0 < s의 길이 < 1,000
s는 소문자로만 이루어져 있습니다.

<예시>

sresult
"abcabcadc""d"
"abdc""abcd"
"hello""eho"

답안

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

class Solution {
    public String solution(String s) {
        String answer = "";
	    List<Character>list=new ArrayList<>();
	    
        // 중복되는 문자열에 제거해서 계속 변경해줄 문자열 새로 생성
	    String a=s;
			
         for(int i=0; i<s.length();i++) { 
             if(list.indexOf(s.charAt(i))==-1) {
                 list.add(s.charAt(i)); 
             }
             else {
                 a=a.replace(String.valueOf(s.charAt(i)),""); 
             } 
        } 
        // 알파벳 순 정렬하기 위한 변환
	    char[] array=a.toCharArray();
	    Arrays.sort(array);
	    answer=new String(array);
        
        return answer;
    }
}

🧵 과정

처음에 한 생각은 List를 하나 만들어서 indexOf로 처음 들어오는 값이면 넣어주고 중복되는 값이면 list에서 remove 해주자 해서 쉽게 풀리는 것 같았는데 중복되는 문자 없애는게 2번 중복된건 쉽게 없앨 수 있는데 3번째 나오면 다시 list에 들어가버려서 문제였다.
그래서 그 다음에는 set으로 만들어서 중복값을 자동으로 제거해주는 식으로 해야되나 했는데 그러면 한번은 무조건 들어가는게 문제였다...
그래서 중복되는 값이 확인되면 그 문자열 자체에서 삭제해줘야겠다고 생각했는데 기존 문자열을 바꾸면 반복문 돌릴때 문자열의 길이랑 charAt(i)으로 가져오는데 있어서 약간 오류가 있어서 그냥 계속 값을 변경해줄 문자열을 새로 하나 만들었다.
그래서 결국 list에 값이 있는 경우에는 새로 만든 문자열에서 그 값 전체를 빼주고
그 문자열을 정렬시켜서 answer로 반환해줬다.
list없이도 풀 수 있을것 같긴한데 문자열 자체를 list로 변환해서 contains로 확인해주니까 내가 잘 못 한건지 제대로 안 나와서 그냥 list 써먹었다.
근데 다른 사람들 풀이 보니까 나 진짜 멍청하게 푼 것 같긴해...
그래도 이것저것 해보느라고 새로운거 아주 조금이라도 공부했으니까 그냥 만족

0개의 댓글