code/[프로그래머스] python

[코딩 테스트 연습 입문] 한 번만 등장한 문자

오리는짹짹 2022. 12. 28. 10:52

문제

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

 

❗제한사항

  • 0 < s의 길이 < 1,000
  • s는 소문자로만 이루어져 있습니다.

 

입출력 예

 

입출력 예 설명

입출력 예 #1

  • "abcabcadc"에서 하나만 등장하는 문자는 "d"입니다.

입출력 예 #2

  • "abdc"에서 모든 문자가 한 번씩 등장하므로 사전 순으로 정렬한 "abcd"를 return 합니다.

입출력 예 #3

  • "hello"에서 한 번씩 등장한 문자는 "heo"이고 이를 사전 순으로 정렬한 "eho"를 return 합니다.

 

✔풀이

def solution(s):
    answer = ''
    s=list(s)
    s.sort()
    
    for i in range(len(s)):
        if len(s)==1:
            answer=s[i]
        else:
            if i==len(s)-1:
                if s[i]!=s[i-1]:
                    answer+=s[i]
            else: 
                if s[i]!=s[i-1] and s[i]!=s[i+1]:
                    answer+=s[i]

    return "".join(answer)

📝설명

문자열에서 한 번만 등장하는 문자만 찾아서 return해야 한다. 

만약 한 번만 등장하는 문자가 없다면 빈 문자열을 return 해야 한다.

s를 문자 순으로 정렬하고 난 뒤, for문을 s의 길이만큼 돌리고, 앞뒤 문자와 비교해서 앞뒤 문자와 같지 않다면 한 번만 나오는 문자이기 때문에 return값인 answer에 해당 문자를 추가하는 코드를 짰다.

이 때, s는 현재 문자열이기 때문에 그대로 for문에 넣어버리면 오류가 발생한다.

따라서 list로 변환한 후, 정렬을 한다.

for문은 조금 복잡하다.

우선, 앞뒤 문자를 비교하고 싶지만,, 만약에 len(s)가 1이라면?

비교할 게 없다. 따라서, len()이 1인 경우에는 answer가 s[i]이 되도록 했다.

그렇다면 나머지 경우에는 무조건 len()이 2 이상일 것이다.

만약에 i가 0이어도 이 식이 돌아가나? 라는 생각이 잠깐 들었지만, 그렇게되면 s[-1]과 s[0]을, s[0] s[1]을 비교하게 된다.

[-1]은 마지막 인덱스 넘버를 의미하기 때문에 코드의 실행에 문제가 없다는 말씀!

나머지 경우를 그럼 다시 생각해보자.

만약 마지막 문자라면 그 다음 인덱스가 없는데 어떻게 해야 할까?

이 때는, 다시 경우를 나누어서 s[i]와 s[i-1]을 비교한 후, 다르다면 answer에 추가한다.

앞서 다룬 경우 (len이 1인 경우, len이 아닌데 마지막 문자열인 경우)를 제외한 나머지 경우들에는 앞뒤문자와 비교하여 다르다면 answer에 추가한다.

이대로 return을 하면 망한다.

왜냐하면 지금까지 코드를 list로 변환해서 짰는데, 문제에서는 문자열로 return 했기 때문이쥐..

따라서 return값에 "".join()을 사용해서 문자열로 변환해준다.

 

👑모범 답안

🔎 전 아직 한 줄 코딩이 익숙하지 않습니다.. 하지만 이해하는 속도는 빨라지고 있어요.

이 코드를 풀어쓰면 

와 같다. 

s를 for문을 통해 돌리고 s를 count(ch)해서 값이 1이라면, answer에 ch를 더한다.

그리고 나서 사전 순으로 정렬해야 하므로, answer를 list로 변환한 값을 sorted()를 이용하여 정렬시킨다.

그렇게 되면 answer에 정렬된 리스트 answer이 들어가게 되는데, "".join()을 이용하여 return 시킨다.

 

👀느낀 점

: count()를 이용했으면 더 쉽게 할 수 있었던 문제다. 쩝..

난 할 수 있다.