[알고리즘] 구름레벨 (출석부)

정보구니·2021년 11월 25일
0

알고리즘

목록 보기
2/8

구름LEVEL-출석부 알고리즘 문제를 풀어보았다.

문제




나의 답안

접근

이름을 알파벳 순서대로 역정렬 sort를 해준다음, 첫번째 알파벳을 변수에 저장하고
이름에서 변수에 저장된 알파벳을 찾아 제거해주면 되려나? 싶었다.

시도1

name = input('이름을 입력하세요: ')  # 입력값을 받아주는 변수 설정
name_list = list(name)  # 문자열 한글자씩 끊어서 리스트로 반환해주기
# name_str = ''.join(name_list) # 리스트를 문자열로 합치기

name_array = name_list.sort(reverse=True)  # 리스트 역정렬해주기 - 내림차순
print(name_array)  # None이 출력 >> 오류!

데이터를 정렬해야한다고 접근하니까 sort메서드를 사용해야겠다고 생각했다.

따라서 입력값을 리스트 자료형으로 반환해주고,
sort의 기본정렬방식인 내림차순이 아닌 오름차순으로 정렬해주기 위해 reverse=True를 인자로 넣어주었다.

받아온 리스트 자료형을 오름차순으로 정렬해오는 것은 성공하였지만,
원상태의 리스트(name_list)까지 수정해버린다는 점에서 오류를 발견하였다 !

따라서 원상태의 리스트는 수정하지 않고, 정렬한 뒤 새로운 리스트를 반환해주는 메서드를 찾아보았다.

찾아보니 sorted 함수라는 파이썬 내장함수가 있었다.
sorted는 매개변수로 들어온 데이터를 새로운 정렬된 리스트로 만들어서 반환해 주는 함수이다.

🔎 파이썬 정렬 sorted 함수


시도2

name = input('이름을 입력하세요: ')
name_list = list(name)

name_array = sorted(name_list, reverse=True)

delete_alphabet = name_array[0]  # 지워줄 알파벳 변수에 저장
name_list.remove(delete_alphabet)  # 원상태 리스트(입력 이름)에서 해당 알파벳 제거/ remove():중복값이 있을 경우 첫번째 요소를 제거함

rename = ''.join(name_list)  # 리스트를 문자열로 합치기
print(rename)

sorted 함수를 이용하여 정렬된 새로운 리스트를 name_array라는 변수에 저장하고,

리스트의 0번째 인덱스를 가져와 원상태의 리스트(name_list)에서 제거해주었다.

제거해준 뒤 리스트를 문자열로 합쳐 출력해주는 방식으로 완성을 하였다.


예제로 주어진 입력값을 입력하였을 때 결과도 성공적으로 출력되었다.

하지만 답안을 제출했을때 하나의 fail을 받았다...럴수럴수 이럴수가



실패원인

내가 짠 코드는 정렬을 했을때 알파벳의 가장 마지막 순서인 데이터를 뽑아와 해당 알파벳을 제거해주는 방법이다.

따라서 yaz같은 입력값을 받았을 때 z가 가장 마지막 순서인 알파벳이기 때문에 z를 제거한 ya라는 결과값을 출력한다.

하지만 이는 사전순 가장 앞서는 결과값이 아니다.
사전순 가장 앞서기 위해서는 y를 제거한 az가 되어야 하는 것이다.

따라서 나의 개명 프로그램은 잘못되었다는 것을 알 수 있다😭



다른 답안

현재 같이 공부하고 있는 스터디 멤버 중 한분이 작성하신 답안이다.

a=list(input())
n=len(a)
b=[]

for i in range(n-1):  # n-1인 이유 : 맨 마지막 글자
    if a[i]<=a[i+1]:
        b.append(a[i])

    if a[i]>a[i+1]:
        for j in range(i+1,n):
            b.append(a[j])
        break

r=''.join(b)
print(r)

이 답안이 스터디원들의 답안 중에서 가장 모법답안 이었다

코드해석을 해보자면,

  • a=list(input()) : 입력값을 a라는 변수에 리스트형태로 저장을 한다.
  • n=len(a) : n이라는 변수에 a리스트의 길이를 저장을 한다.
  • b=[] : b라는 변수에 빈 리스트를 만들어둔다.
  • for i in range(n-1): : n-1번 까지 반복하여 i에 값을 넣어준다.
  • if a[i]<=a[i+1]: : a리스트의 i번째 값이 a리스트의 i+1번째값보다 작거나 같은 경우,
    즉 이름의 첫번째 알파벳과 두번째 알파벳을 비교했을때 두번째 알파벳이 크거나 서로 같을 경우
  • b.append(a[i]) :

0개의 댓글