오류 및 알고리즘정리본

#16 프로그래머스 문자열내마음대로정렬하기 & 문자열정렬2 & 중복된문자제거(dict.fromkeys)

츄98 2023. 5. 5. 00:40

1. 문자열 내 마음대로 정렬하기

 

sort() 함수에 key를 사용하여 조건에 맞게 정렬할 수 있다.  설명은 다음과 같다.

If a key function is given,
apply it once to each list item and sort them, ascending or descending, according to their function values.

문제에서 각 문자열의 인덱스 n번째 글자를 기준으로, 그리고 인덱스 n번째 글자가 같은 문자열이 여럿일 경우에는 사전순으로 정렬하라는 조건이 있기 때문에, 키를 통해 조건을 지정해주었다.

strings.sort(key=lambda x:(x[n],x))

 

전체 풀이)

# 내 풀이
def solution(strings, n):
    strings.sort(key=lambda x:(x[n],x))
    # 인덱스 n번째 문자가 같은 문자열이 여럿일 경우, 사전순으로 정렬하라고 했으므로
    # 이 경우 때문에 lambda에 x[n] 뿐 아니라 x도 넣음!
    # 예시로는, ["abce", "abcd", "cdx"] 을 입력했을 때 ["abcd", "abce", "cdx"] 출력되는 것
    return strings

 

sort() 함수에서 key로 정렬하는 조건을 정해줄 수 있음을 몰랐다고 하더라도 다음과 같은 풀이로 풀 수 있다.

def solution(strings, n):
    new =[]
    answer =[]
    for i in range(len(strings)):
        a = strings[i][n]
        b = a+strings[i]
        new.append(b)
    new.sort()
    for i in range(len(new)):
        c = new[i][1:]
        answer.append(c)
    return answer

이는 n번째 인덱스에 해당하는 문자를 문자열 제일 앞에 붙이고, sort()를 한다.

그럼 n번째 인덱스 문자를 기준으로 리스트 속 문자열들이 정렬될 것이다.

그런 후에 문자열의 첫번째 문자 즉, n번째 인덱스 문자를 붙인 것을 제거하고 return하면 된다.

 

 

2. 문자열 정렬하기 2

def solution(my_string):
    return ''.join(sorted(my_string.lower()))
# sorted를 하면 리스트로 반환되므로 join을 통해 문자열로 바꿔주기

 

 

3. 중복된 문자 제거하기

# 중복된 문자 제거
# 내풀이
def solution(my_string):
    answer = ''
    for i in range(len(my_string)):
        if my_string[i] not in answer:
            answer += my_string[i]
    return answer

def solution(my_string):
    answer = ''
    for i in my_string:
        if i not in answer:
            answer += i
    return answer

# 다른 풀이
def solution(my_string):
    # print(dict.fromkeys(my_string))
    return ''.join(dict.fromkeys(my_string))
# fromkeys : Create a new dictionary with keys from iterable and values set to value.

두 가지 버전으로 풀어보았다. 사실 원리는 완전 똑같고..ㅎㅎ 

하나는 my_string 문자열 길이만큼 for문을 돌려서 확인하고,

나머지 하나는 바로 my_string에서 하나씩 문자를 꺼내서 확인하는 방법의 차이일 뿐이다.

 

다른 풀이로, fromkeys를 활용한 풀이가 있어 인상깊어서 가지고 왔다.

print(solution("We are the world")) 이렇게 했을 때,
print(dict.fromkeys(my_string))의 출력값은?

{'W': None, 'e': None, ' ': None, 'a': None, 'r': None, 't': None, 'h': None, 'w': None, 'o': None, 'l': None, 'd': None}

dict.fromkeys(my_string}을 하면 위와 같은 딕셔너리가 만들어지고, 이를 join을 통해 문자열로 반환해주는 것이다.

 


dict.fromkeys(keys, value)

  • 딕셔너리를 생성할 때 편리하게 사용할 수 있는 메소드. keys 옵션 값에 문자열을 입력할 수도 있다.
  • keys: 생성하려는 dictionary의 키(key)의 목록
  • value: 생성하려는 dictionary의 값(value)
  •  메서드 명 앞에 반드시 dict 키워드 붙여야 함.
  •  List 중복 요소 제거에 사용 가능. 

 

사용 예시)

1. 문자열

print(dict.fromkeys("Hello"))

# 출력값 {'H': None, 'e': None, 'l': None, 'o': None}

print(dict.fromkeys("Hello",10))

# 출력값 {'H': 10, 'e': 10, 'l': 10, 'o': 10}

 

2. 리스트

print(dict.fromkeys([1,2,3,4],10))

# 출력값 {1: 10, 2: 10, 3: 10, 4: 10}

 

3. 튜플과 집합

print(dict.fromkeys((1,2,3)))

# 출력값 {1: None, 2: None, 3: None}

print(dict.fromkeys({"a","b","c"},0))

# 출력값 {'a': 0, 'b': 0, 'c': 0}