<로직 고민>
- 상당히 어려워 보이는군...
- 일단은...n번째 인덱스의 값을 다 추출해서 정렬을 하고 strings를 하나씩 돌리면서 n번째 인덱스의 값이 정렬된 거에 몇 번째에 위치하는지 파악하는거지..
- 근데 문제는 n번째 인덱스의 값이 겹치는 경우...그걸 어떻게 나눠주냐인데 흠
- count를 써서 1번만 겹치면 해당 자리에 넣고 2개 이상이면 거기서 또 정렬을 해주면 될까나
- 일단 처음 배열은 0으로 된 strings 길이의 배열로 선언해야겠군 값을 바꿔주려면
def solution(strings, n):
# strings 길이만큼 0으로 된 배열로 초기화
answer = [0 for _ in range(len(strings))]
# 정렬 기준이 되는 배열 생성
sort_string = []
for string in strings:
sort_string.append(string[n])
sort_string.sort()
# answer에 값 넣기...
resort = []
for i, string in enumerate(strings):
count = 0
for j, sort in enumerate(sort_string):
if string[n] == sort:
count += 1
a_index = j
if count == 1:
answer[a_index] = string
else:
resort.append(string)
resort.sort()
for re in resort:
for j, answer_0 in enumerate(answer):
if answer_0 == 0:
answer.insert(j, re)
return answer
- 후..이렇게 하면 입출력 예1은 통과하는데 2는 시간초과된다
- 그럴 거 같긴 했는데 하 너무 복잡하고 어떻게 해야 할지 모르겠다.....
- 생각을 달리해보자..
- sort_string의 각 값을 딕셔너리의 밸류값으로 하고 srings의 각 값을 키값으로 하자
- 밸류를 기준으로 정렬을 하고 밸류값이 같은 키끼리 또 정렬을....하는 게 ...되나....?일단 도전
def solution(strings, n):
# strings 길이만큼 0으로 된 배열로 초기화
answer = [0 for _ in range(len(strings))]
dic_string = {}
# 정렬 기준이 되는 배열 생성
sort_string = []
for string in strings:
sort_string.append(string[n])
sort_string.sort()
# 딕셔너리 생성
for string in strings:
for sort in sort_string:
if string[n] == sort:
dic_string[string] = sort
# 딕셔너리 밸류값 기준으로 정렬
answer = sorted(dic_string, key=lambda x: dic_string[x])
return answer
print(solution(["sun", "bed", "car"], 1)) # ['car', 'bed', 'sun']
print(solution(["abce", "abcd", "cdx"], 2)) # ['abce', 'abcd', 'cdx']
- 뭔가 거의 다 온 느낌....?
- n번째 인덱스가 같은 경우 정렬을 해야 하는데....
- 키값을 기준으로 정렬을 먼저 해도 다시 저렇게 된다
- 밸류값 기준으로 정렬한 다음 키값 기준으로 정렬하면 예시1번이 틀린다
- 후...어떻게 하지.....
- answer를 다시 for문에 하나씩 돌려서..
- 딕셔너리는 버리자...다시 처음으로
def solution(strings, n):
answer = []
# 정렬 기준이 되는 배열 생성
sort_string = []
for string in strings:
sort_string.append(string[n])
sort_string.sort()
# stirngs를 사전순으로 먼저 정렬함
strings.sort()
for sort in sort_string:
for string in strings:
if sort == string[n]:
answer.append(string)
return answer
- n번째 알파벳이 중복되는 글자를 사전순으로 정렬하려면 먼저 strings를 정렬하면 되는 거였다,,
- 그러고 처음 문제를 풀려고 했을 땐 순서를... 인덱스를..어케....이랬지만 일단 정렬 기준인 sort_string을 돌리면서 해당하는 값이 나오면 answer에 붙이면 된다
- 아깐 왜 이렇게 생각을 못 했는지.....이해가 안 되네
- 근데 이렇게 하면 2번째 예시에서 중복값이 나온다..sort에서 첫 번째 c가 나올 때 strings에 해당되는 게 2개 있으니까 그게 붙고 그 다음 sort에 두 번째 c가 나올 때 또 붙는다
- 이래서 내가 인덱스에 집착을 했었다....
- 근데 그냥 이미 append된 string은 strings에서 빼면 되는 거였다
def solution(strings, n):
...
for sort in sort_string:
for string in strings:
if sort == string[n]:
answer.append(string)
strings.remove(string) # 이거 추가!
return answer
- 오 이렇게 하니까 예시 1,2번은 통과된다
- 근데.......
- 뭐냐고...................
- 후.. 찾았다 답은 break였다
- 어떤 케이스에서 실패하는 건지는 모르겠지만 곰곰이 생각해보니 이미 answer에 string이 붙었는데 strings를 더 돌릴 필요가 없겠단 생각이 들었다
- 이미 기준 알파벳에 맞는 string이 붙었으니..!! 그래서 break를 쓰니 테스트를 통과했다...후
<완성된 코드>
def solution(strings, n):
answer = []
# 정렬 기준이 되는 배열 생성
sort_string = []
for string in strings:
sort_string.append(string[n])
sort_string.sort()
# stirngs를 사전순으로 먼저 정렬함
strings.sort()
for sort in sort_string: # 기준이 되는 알파벳과
for string in strings: # 사전순으로 정렬된 strings를 돌리면서
if sort == string[n]: # 기준 알파벳과 string의 n번째 알파벳이 일치하면
answer.append(string) # answer에 string을 붙이고
strings.remove(string) # 그 string은 strings에서 뺀다(안 빼면 중복 발생)
break # answer에 string 붙었으니까 strings 더 돌릴 필요없음
return answer
<다른 사람 풀이>
- 천재풀이1
def solution(strings, n):
return sorted(sorted(strings), key=lambda x: x[n])
- 난 그동안 뭘 한 걸까.......
- sorted 2번 할 필요없이 아래처럼 풀어도 된다고 한다
def solution(strings, n):
return sorted(strings, key=lambda str: (str[n], str))
- 이젠 정말 람다식을 이해해야 할 때가 온 것이지....
- 이걸 알아야 삽질을 안 할 수 있어....
- 람다 표현식(lambda expression) — 구민정의 개발일지 (tistory.com)
- 첫 번째 풀이는 strings를 오름차순(사전순)으로 먼저 정렬하고 strings의 요소들을 각 x로 치환해서 x의 n번째 인덱스 값을 기준으로 정렬함
- 두 번째 풀이는 strings의 요소들을 각 str로 치환해서 먼저 str의 n번째 인덱스 값 기준으로 정렬하고 n번째 인덱스 값이 일치하는 경우 str 순(오름차순, 사전순)으로 정렬함
- 후 드디어 이해 끝!!
- 나도 다음에 람다식 사용한다!!!