본문 바로가기

스파르타코딩클럽/항해99

항해 9일차 TIL

1. 어제 하던 중복문자제거 이어서

어제는 문제를 잘못 이해해서 전부 다 사전순으로 정렬했는데, 사전식 순서와 사전순은 다른 뜻이었다...  https://developyo.tistory.com/97 < 여기에서 사전식 순서가 뭔지 찾아봤는데, 여기서 설명하는거랑 문제가 요구하는거랑은 또 다르고.

기본적인 순서는 섞지 않으면서 그 중 나올 수 있는 가장 작은 조합을 찾는거였나보다.

 

1) 처음에 시도한 방법

import collections

def remove(s):
    # 어디부터 시작해야할지 제일 작은 알파벳부터 찾는다
    start = sorted(set(s))
    # 하나씩 순서대로 꺼내오며 비교해보기 위해 리스트화
    letterlist = list(s)
    # 문자가 몇개 있는지 세어보기
    count = collections.Counter(s)
    # 결과를 담아줄 빈 리스트
    result = []

	# letterlist 중 start의 0번째, 즉 가장 작은 알파벳의 인덱스 숫자만큼 돌며
    for a in range(letterlist.index(start[0])):
        # 만약 letterlist[a]의 숫자가 1보다 많다면, 즉 중복된 문자가 있다면
        if count[letterlist[a]] > 1:
            # 뒤에서도 나올테니 통과
            continue
        # 아니라면, 즉 1개일 경우
        else:
            # 위에서 만들어준 빈 리스트 result에 letterlist[a]를 담아준다
            result.append(letterlist[a])

    # 비교하기 위해 j를 설정
    j = letterlist.index(start[0]) + 1

    # letterlist에서 제일 작은 알파벳이 있는 자리부터 순서대로 하나씩
    for a in letterlist[letterlist.index(start[0]):]:
        # 일단 result에 a를 담아준다
        result.append(a)
        # 그리고 letterlist[a] 보다 하나 뒤에 있는 알파벳부터 돌며
        for b in letterlist[j:]:
            # 만약 a 랑 b가 같다면 result에 담아주고
            if a == b :
        j += 1
        # 그렇게 순서대로 제일 작은 알파벳 이후의 알파벳들을 겹치는대로
        # 순서대로 result에 담아둔 뒤, 다시 겹치는 애들은 빼주려고 했는데..!
                
        j += 1

했.는.데... 저렇게 하면 제일 작은 문자 이후의 문자들은 사진식순서로 들어가는게 아니라 그냥 순서 상관없이 a 이후에 나온 문자들은 순차적으로 다 들어가게 된다. 이건 안먹히니까 뒤엎기.

그래도 일단 제일 작은 문자 위치를 잡고, 그 앞의 애들부터 일단 빈 리스트에 추가한 다음 제일 작은 문자를 추가해준 접근까지는 괜찮지 않았나 싶어서 거기부터 다시 시도하기로 했다.

 

2) 두번째 시도

점심먹는 동안 까먹을까봐 일단 먼저 적어두고

일단 그림처럼 생각해두고 시작하려고 했다. 그런데... 점심먹고 와서 당충전 한 짱짱한 뇌로 다시 생각해보니 저렇게 하면 결과가 eadbcf가 된다! 제대로 하면 eacdbf가 되어야 하는데 결과가 잘못됐다. 그리고 사실 이 문제 고민하는데 2시간이 훨씬 지나버렸기 때문에... 여기부터는 그냥 해설을 보고 풀기로 했다. 처음으로 혼자 풀려고 시도한 문제였는데, 첫 문제부터 난이도가 너무 높았던 것 같다.

3) 해설에 나온 재귀를 이용한 분리

def remove(s):
    # 중복된 요소들 제거 후 오름차순으로 정렬한 뒤 for문으로 돌리기
    # a, b, c, d, e, f 동안 돌게 된다
    for char in sorted(set(s)):
        # s에서 s의 char에 해당하는 index 번호부터 시작해 한개씩 순차적으로 suffix에 담아준다
        # char가 a일 경우 s.index(char)는 4, 4번째부터 순차적으로 마지막까지 담긴다
        # a, c, d, c, b, c, f
        suffix = s[s.index(char):]
        # 만약 s의 중복된 요소를 제거한 리스트와 suffix의 중복된 요소를 제거한 리스트가 같다면
        # a, b, c, d, e, f 와 a, b, c, d, f
        if set(s) == set(suffix):
            # suffix에서 char에 해당되는 요소를 공백으로 바꾼 뒤
            # 위의 함수를 실행한 다음 char와 합치기
            return char + remove(suffix.replace(char, ''))
    return ''
    
letters2 = "fecbacdcbcf"
print (remove(letters2))

음... 완전히 잘은 이해되지 않는다... 재귀식이 간결하고 우아하다는데, 그래서 쓰는건가? 보기에 괜찮으니까..? 일단 따라잡아야할 진도가 잔뜩 밀려있으니 대충 이런 방법이 있구나 하고만 넘어가야겠다. 

 

 

 

2. 오늘 느낀 것

 

중복문자제거 풀면서 정말 정신없이 몰입하다보니 배고픈 것도 잊고 있었다. 알고리즘 주차 팀장님이 정해주신 시간표와, 내가 챙겨줘야하는 아이가 있지 않았더라면 아마 끼니도 거르고 풀고 있지 않았을까.

점심 차리면서 조금 깨어나고 보니 진짜 미친듯한 허기가 몰려왔다. 진짜 에너지 많이 쏟았나보다 ㅋㅋㅋㅋㅋ 기분 좋다.

 

하지만 기분 좋은 것과는 별개로 오늘 성과는 별로 없다... 어려운 문제에 몰입해봤지만, 이렇게 어려운걸 풀려고 오랫동안 매달리는 것보다 쉬운것부터 먼저 풀면서 사고력을 먼저 길러야 할 것 같다.

어렵다. 공부 방향을 어떻게 잡아야 할까.

 

벌써 화요일이 다 갔다. 뒤처진 만큼 올바른 방향을 잡아야한다. 내일부터는 어려운 문제는 일단 미뤄두고, 책에서 다루고자 하는 개념만 익히고 쉬운 문제 푸는데 집중해야겠다. 쉬운 것 부터 시작해서 하루에 딱 5시간만 풀자. 내가 하루에 공부하는 시간이 밥먹는 시간, 운동하는 시간 다 빼도 최소 12시간인데. 그 중 고작 5시간이라니 쉽다 쉬워.

 

가보자고!

'스파르타코딩클럽 > 항해99' 카테고리의 다른 글

항해 11일차 TIL  (0) 2022.01.20
항해 10일차 TIL  (0) 2022.01.19
항해 8일차 TIL  (0) 2022.01.17
항해 1주차 WIL  (0) 2022.01.16
항해 6일차 TIL  (0) 2022.01.15