문제
신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.
풀이
def solution(new_id):
answer = ""
# 1 소문자 만들기
new_id = new_id.lower()
# 2 소문자, 숫자, 빼기, 밑줄, 마침표만 사용
for value in new_id:
if value.islower() or value.isdigit() or value in ["-", "_", "."]:
answer += value
# 3 . 두번 이상 반복되는 경우 .로 변경
while '..' in answer:
answer=answer.replace('..', '.')
print(answer)
# 4 .가 처음이나 끝에 위치하면 삭제
if answer[0] == ".":
if len(answer) >= 2:
answer = answer[1:]
else:
answer="."
if answer[-1] == ".":
answer = answer[:-1]
# 5 빈 문자열인 경우 a 대입
if answer == "":
answer = "a"
# 6 16자리 이상인 경우 15자리까지 변경
if len(answer) >= 16:
answer = answer[:15]
if answer[-1] == ".":
answer = answer[:-1]
# 7 2자 이하인 경우 마지막 문자 추가
while len(answer) < 3:
answer += answer[-1]
return answer
이 문제는 기본적인 문자열 변경과 구조에 대해 알고 있어야 한다. 문자열의 index와 문자열 관련 함수를 알고 있어야 쉽게 풀 수 있는 문제이다. 내 풀이는 복잡한 부분이 있어 모범답안을 참조하였다.
이 문제는 문자열에 대한 판별, 수정, 추가, 삭제 등을 이해하고 있는지가 주요한 문제였다.
<1> 소문자 만들기
# 1 소문자 만들기
new_id = new_id.lower()
파이썬에서 문자열 내에 모든 알파벳을 소문자로 변경 해 준다. 반대로 .upper()로 사용하면 대문자로 바꿀 수 있다.
<2> 소문자, 숫자, 빼기, 밑줄, 마침표만 사용
# 2 소문자, 숫자, 빼기, 밑줄, 마침표만 사용
for value in new_id:
if value.islower() or value.isdigit() or value in ["-", "_", "."]:
answer += value
value.islower() - 문자열이 모두 소문자인 경우 True, 하나라도 아닌 경우 False를 표출합니다.
value.isdigit() - 문자열이 모두 숫자인 경우 True, 하나라도 아닌 경우 False를 표출합니다.
value in ["-", "_", "."] - 파이썬의 장점은 in과 not in이다. 여러 조건이 있는 경우 이와 같이 in을 사용하도록 한다.
answer += value - 위 조건을 통과한 문자열은 answer에 추가한다.
<3> 두번 이상 반복되는 경우 .로 변경
while '..' in answer:
answer=answer.replace('..', '.')
print(answer)
answer.replace('..','.') - 문자열에서 replace 함수는 문자열의 값을 변경하도록 해 준다. 따라서 ..를 .로 변경하게 되며, answer 내에 ..이 없을 때까지 이를 반복한다.
<4> .가 처음이나 끝에 위치하면 삭제
# 4 .가 처음이나 끝에 위치하면 삭제
if answer[0] == ".":
if len(answer) >= 2:
answer = answer[1:]
else:
answer="."
if answer[-1] == ".":
answer = answer[:-1]
문자열 index 사용하여 첫 번째 인덱스인 [0]의 값이 "."인 경우 슬라이싱으로 [1:] 두 번째부터의 값이 입력되도록 한다.
이 때 answer의 문자열이 1개인 경우 index out of range 에러가 발생하므로 길이가 2 이상일 때에 이를 사용한다.
길이가 1인 경우 "."로 따로 정의한다.
[-1] 인덱스를 사용하는 경우 끝 값이다.
<5> 빈 문자열인 경우 a 대입
# 5 빈 문자열인 경우 a 대입
if answer == "":
answer = "a"
""와 같이 빈 경우 a를 입력한다. 빈 문자열이 ""를 쓴다는 점을 기억하도록 한다.
<6> 16자리 이상인 경우 15자리까지 변경
# 6 16자리 이상인 경우 15자리까지 변경
if len(answer) >= 16:
answer = answer[:15]
if answer[-1] == ".":
answer = answer[:-1]
슬라이싱을 이용하여 15자리까지로 변경한다. 이 때 끝 값이 "."이 되면, 이를 제거한다.
<7> 2자 이하인 경우 마지막 문자 추가
# 7 2자 이하인 경우 마지막 문자 추가
while len(answer) < 3:
answer += answer[-1]
return answer
answer의 값이 3 미만인 경우 마지막 값을 문자열 더하기 연산을 통해 계속해서 덧붙여준다.
'파이썬 > 파이썬 알고리즘' 카테고리의 다른 글
파이썬 코드업 6030번 6030 : [기초-값변환] 영문자 1개 입력받아 10진수로 변환하기(설명)(py) (0) | 2021.04.28 |
---|---|
파이썬 코드업 6029번 6029 : [기초-값변환] 16진 정수 입력받아 8진수로 출력하기(설명)(py) (0) | 2021.04.28 |
파이썬 프로그래머스 level 1. 크레인 인형뽑기 게임 (0) | 2021.04.26 |
파이썬 백준 1012번 유기농 배추 땅의 모습이 아니라 배추의 위치가 주어지는 문제 - DFS/BFS 풀이 (0) | 2021.04.05 |
파이썬 백준 7562번 나이트의 이동 나이트를 목적지까지 이동시키는 문제 (0) | 2021.04.03 |
댓글