코딩,해볼까

05.01. 과제해설 / 문자열과 리스트 딕셔너리 뽀개기 [::] / 다양한 함수들 총집합! 본문

Back/TIL

05.01. 과제해설 / 문자열과 리스트 딕셔너리 뽀개기 [::] / 다양한 함수들 총집합!

떠굥 2023. 5. 1. 20:52

0.  오늘의 공부

1) 과제 해설 강의

2) 알고리즘 풀이

 

📍 프로그래머스 - 코딩테스트 입문  문자열 정렬하기 (2)

 

def solution(my_string):
    # answer = ''
    lower_string = list(my_string.lower())
    sort_string = sorted(lower_string)
    return ''.join(sort_string)
    
    
# 축약

def solution(my_string):
    return ''.join(sorted(my_string.lower()))

 

 

📍 프로그래머스 - 코딩테스트 입문 한 번만 등장한 문자

 

나는 풀지 못했지만 팀원들이 나의 생각을 발전시켜 주셨다.

s 문자열을 list화 한다.

set 함수를 통해 중복을 제거한 dict 형태를 list화 한다.

fot문에서는 중복을 제거한 set함수를 넣어준다.

i를 리스트에서 지운 후 i가 리스트에 없다면, 그 리스트에서는 1개만 존재했다는 뜻이므로 이 i를 answer에 추가해준다.

문제를 풀기 전에 구상해나가는 과정이 중요하다.

 

def solution(s):
    answer = ''
    s_list = list(s) # list['a', 'b', 'c', 'a', 'b', 'c', 'a', 'd', 'c']
    # s_set_list = set(list(s)) # dict{'a', 'c', 'd', 'b'}
    s_set_list = list(set(list(s))) # list['a', 'c', 'd', 'b']
    for i in sorted(s_set_list):
        s_list.remove(i)
        if i not in s_list:
            answer += i
    # 지우고 나서 리스트에 없다면 1개만 있었다는 것이므로 그 i를 answer에 추가해준다.
    return answer

 

인상깊었던 코드 정리

 

#1. [::]의 의미

# 팀원분의 코드. words[::] 깊은 복사..
answer = ''
    words = sorted(s)
    for i in range(len(words)):
        alpha = words[::] # words.copy()

 

 

#2. 너무나도 간단한 count 활용 함수

def solution(s):
    answer = ''
    for i in s:
        if s.count(i)==1:
            answer+=i
    answer=''.join(sorted(answer))	
    return answer

 

#3. dict 활용 / for key, value in .items() 활용 / 코드가 예쁘다

def solution(s):
    s = sorted(s)
    answer = {}
    list = ''

    for i in s:
        try:
            answer[i] += 1
        except:
            answer[i] = 1
    
    
    for key, value in answer.items():
        if value == 1:
            list += key     
            
    return list

 

#4. 우리조의 알고리즘 멋쨍이 팀원분의 다른 팀원분들의 생각과 코드 리펙토링 과정. 두고두고 찾아보고 싶다.

def solution(s):
    # 문자열 s
    # in으로 확인하기
    answer = ''
    s_list = {}
    for i in s:
        if i not in s_list:
            s_list[i] = 1
        elif i in s_list:
            s_list[i] += 1
    # for문의 순서 = key를 기준으로 sort된 s_list로 사용
    for i in sorted(s_list.keys()):
        # value 값이 1이면
        if s_list[i] == 1:
            answer += i
    return answer

# dict활용 풀이 리팩토링 
def solution(s):
    s_dict = {}
    for i in s:
        # s_dict에 없다면
        if i not in s_dict:
            s_dict[i] = 1
        # s_dict에 있다면
        elif i in s_dict:
            s_dict[i] += 1
        # if 값이 1인 key를 정렬해서 리스트화
        # ''.join()으로 리스트 언패킹
    return ''.join([i for i in sorted(s_dict.keys()) if s_dict[i] == 1])

# list pop활용 풀이 
def solution(s):
    answer = []
    pop_list = []
    for i in s:
        # answer에 i가 없다면
        if i not in answer:
            answer.append(i)
        # answer에 i가 있다면
        else:
            pop_list.append(i)
    for p in set(pop_list):
        # 전체 리스트에서 index찾기
        pop_index = answer.index(p)
        # 전체 리스트에서 빼기
        answer.pop(pop_index)
        # del로 같은 결과 가능
        # del answer[pop_index]
    return ''.join(sorted(answer))

# count 활용 풀이 
def solution(s):
    # for문 = set()으로 중복을 제거하고 sorted()로 정렬된 s
    # i = count로 확인된 숫자가 1개인 변수
    return ''.join([i for i in sorted(set(s)) if s.count(i) == 1])

# index 활용 풀이 추가 
def solution(s):
    answer = ''
    for n in set(s):
        # 첫번째 index 찾기
        first_index = s.index(n)
        # 두번째 index 찾기 시도
        try:
				    # index(n, s의 시작점)
            _ = s.index(n, first_index+1)
        # 두번째 index가 없을 경우 except ValueError:
        except ValueError:
            answer += n
    return ''.join(sorted(answer))

# 지현님 코드 리팩토링
# remove는 str로 가능하다는 이야기에 힌트 얻음 
def solution(s):
    answer = ''
    words = sorted(s)
    for i in words:
        alpha = words[::] # words.copy()
        alpha.remove(i)
        if i not in alpha:
            answer += i
    return answer

# 혁준님 코드, 서경님 생각 리팩토링 
# set()의 활용이 for문 하나로 그쳐서 변수 선언대신 직접 사용 
def solution(s):
    answer = ''
    s_list = list(s)
    for i in sorted(set(s)):
        s_list.remove(i)
        if i not in s_list:
            answer+=i
    return answer

 

 


1.  문제점

 

모르는 함수가 많다. (정확한 사용법을 잘 모른다.)

pop, sort, for문 등등 여러가지 방법들을 구체적으로 만들어나가지 못했다.

컨디션 난조로 두 번째 문제를 풀 때 집중하지 못했다.

 

 


2. 시행착오

각 타입에 맞는 함수들이 정해져 있는데, 아직 익숙하지 않아서 

생각나는대로 이렇게저렇게 적어봤다.

1) sorted() : 이 내장 함수는 파이썬에서 순회가 가능한(iterable) 객체를 인자로 받는다.

ex) list, dict, set, str, bytes, tuple, range...

* iterable 과 lterator

iterator 객체 는 값을 차례대로 꺼낼 수 있는 객체 = 개념이 조금 어려워서 필요할 때 꺼내보자.

 

 


3. 해결방법

type과 print를 활용하여 형태가 헷갈리지 않게 했다.

type() : 객체를 인자로 받아 해당 객체의 데이터 타입을 반환해주는 함수입니다. 

print() : 출력 함수.

 

 


4. 알게된 점

1) 문자열, 리스트, 딕셔너리는 익숙해질때까지 많이 푸는 수 밖에 없다.

2) set, sort, sorted, for문의 .items 등 많이 쓰지 않는 함수들을 알게되었다.

3) str, int, dict, list 등 형태에 따른 코드를 잘 생각하자.

4) 잊어버리지 않게 매일매일 꼭 알고리즘을 풀자.

5) 짧은 코드들은 시간을 조금 들이더라도 코드를 줄일 수 있는 방법을 한번씩은 고민해보자.

 

 

 

 

Comments