본문 바로가기

Algorithms and Languages/파이썬 알고리즘 문제풀이

[Python/프로그래머스] 121683. 외톨이 알파벳

문제 접근 및 공부 내용, 풀이는 모두 하단 코드에 "주석"으로 포함되어 있으니 참고해주세요.

문제 유형 보기

https://school.programmers.co.kr/learn/courses/30/lessons/121683

 

 

입력 : 문자열 input_string

출력 : 외톨이 알파벳 사전 순 나열한 문자열

input_string	result
"edeaaabbccd"	"de"
"eeddee"	"e"
"string"	"N"
"zbzbz"	"bz"

 

이 문제는 초기 접근에서 많이 어려움을 겪어, 강사님 손글씨 풀이를 듣고 힌트를 얻어 다시 풀이를 시작함.

강사님's 풀이 1)

외톨이, 등장 두 개의 set을 잡고, 마지막 문자라는 변수 하나를 잡음. 문자열을 탐색하며 하나씩 넣음. 이미 등장한 거 안에 있는데 마지막 문자랑 다르면 외톨이에 넣음. 그렇게 해서, 마지막에 외톨이 set 보고 조건문으로 반환하면 됨.

강사님's 풀이 2)

앞뒤에 $ 특수문자 붙이고, 정규 표현식을 a~z에 대해 쓸거임. 기존에 그냥 a로만 split하면 e/a/a/a/b 이렇게 잘리지만, 우리는 a+ 로, a가 하나 이상 나오는 거에 대해서 split 해달라 하면 e/aaa/b로 통으로 짤림. 그렇게 해서 그 덩어리 제외 덩어리가 세 개가 나오면 외톨이 알파벳이고, 그 덩어리 제외 덩어리가 2개 이하로 나오면 외톨이 알파벳이 아니다. 특수문자 붙인 건 양 끝에 있을 때 덩어리 세 개가 안 나올 수 있기 때문.


 

1차 풀이(강사님 손글씨 풀이 보고 나서 품)

# 1차 풀이(성공, 강사님 풀이 스키마 듣고 참고해 품)
from collections import defaultdict
def solution(input_string): # edeaaabbccd
    loner_set = set()
    appeared_set = set()
    previous_char = input_string[0] # e
    appeared_set.add(previous_char)
    
    for char in input_string[1:]:
        if char in appeared_set and char != previous_char:
            loner_set.add(char)
        else:
            appeared_set.add(char)
        previous_char = char

    if not loner_set:
        return 'N'
        # 외톨이 없으면 'N' 반환
    else:
        return ''.join(sorted(loner_set))
        # sorted로 정렬된 리스트 반환 후 그걸 join으로 str로 붙임.

강사님의 풀이 설명을 듣고 1차 풀이를 작성했음.

2차 풀이(강사님 풀이 코드 보고, 내 1차 풀이 코드 최적화하고 다듬음.)

# 2차 풀이(성공, 강사님 풀이 코드 보고 참고해 1차 풀이 코드 수정함)
from collections import defaultdict
def solution(input_string): # edeaaabbccd
    loner_set = set()
    previous_char = input_string[0] # e
    appeared_set = {previous_char}
    
    for current in input_string[1:]:
        if current == previous_char:
            continue
        if current in appeared_set:
            loner_set.add(current)
        else:
            appeared_set.add(current)
        previous_char = current

    if not loner_set:
        return 'N'
        # 외톨이 없으면 'N' 반환
    return ''.join(sorted(loner_set))
        # sorted로 정렬된 리스트 반환 후 그걸 join으로 str로 붙임.

강사님의 풀이 코드 보고 2차 풀이 작성(코드 최적화)

 

 

 

이후, 정규 표현식 풀이도 도전해보자!! (일단 PASS!)