요즘 프로그래머스 사이트를 애용하고 있다.
정말 시험을 보는 것과 비슷한 환경에서
문제를 푸는 것이 중요한 것 같다.
오늘의 문제는
2021 KAKAO BLIND RECRUITMENT에 나왔던 문제로
정말 문제 그대로 풀다 보면
길지만 정답 코드를 풀 수 있었다.
다만 정규 표현식을 사용했다면
엄청나게 짧게도 코드 구현이 가능했다는 사실을 알고
다음번에는 정규식에 대해서 한 번
다뤄봐야겠다고 다짐하게 되었다.
오늘의 문제는 아래 사이트를 통해 확인할 수 있다.
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
1. 아이디어 구현
사실 이 문제는 아이디어를 구현할 것이 따로 없었다.
문제 내에서 문제를 어떻게 처리해야 하는지에 대한
조건을 명시해주었기에
오늘은 별다른 아이디어 설명 없이 바로 코드로 넘어가도록 하겠다.
2. 코드 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
def solution(new_id):
# 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환
tmp = ''
for word in new_id:
if word.isupper():
# 대문자라면 아스키코드를 이용해 소문자로 변환
# lower()함수로 대체 가능
tmp += chr(ord(word) + 32)
else:
tmp += word
# 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
new_id = tmp
tmp = ''
for word in new_id:
if word.islower() or word == '-' or word == '_' or word == '.' or word.isdigit():
tmp += word
# 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
new_id = tmp
tmp = ''
i = 0
while i < len(new_id):
if new_id[i] == '.':
while i < len(new_id) and new_id[i] == '.':
i += 1
tmp += '.'
else:
tmp += new_id[i]
i += 1
# 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거
new_id = tmp
tmp = ''
# 처음 확인
# => 중복 제거를 이미 했으므로 while문을 사용할 필요는 없었다.
i = 0
while i < len(new_id):
if new_id[i] == '.':
i += 1
else:
tmp += new_id[i:]
break
# 끝 확인
new_id = tmp
tmp = ''
j = len(new_id)
tmp = ''
while j > 0:
if new_id[j-1] == '.':
j -= 1
else:
print(j, len(new_id))
tmp += new_id[:j]
break
# 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입
new_id = tmp
tmp = ''
if len(new_id) == 0:
new_id = 'a'
# 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
if len(new_id) > 15:
new_id = new_id[:15]
# 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
tmp = ''
j = len(new_id)
tmp = ''
while j > 0:
if new_id[j-1] == '.':
j -= 1
else:
print(j, len(new_id))
tmp += new_id[:j]
break
# 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
new_id = tmp
tmp = ''
if len(new_id) < 3:
var = new_id[len(new_id)-1]
while len(new_id) < 3:
new_id += var
return new_id
|
cs |
마무리
요즘 다시 알고리즘을 풀고
다른 사람들의 코드를 읽으며
아직도 갈길이 멀다는 것을 뼈저리게 느끼고 있다.
정규 표현식.. 지금은 기억도 나지 않는 트리 등..
앞으로 다룰 내용이 많아지고 있다!
*잘못된 부분이 있다면 댓글 부탁드리겠습니다!
'study > 알고리즘' 카테고리의 다른 글
[python] programmers - 카펫 (0) | 2021.09.14 |
---|---|
[python] programmers - 문자열 압축(2020 KAKAO BLIND RECRUITMENT) (0) | 2021.09.09 |
[python] programmers - 키패드 누르기(2020 카카오 인턴십) (0) | 2021.08.10 |
[python] 백준 - 22352 항체 인식 (0) | 2021.08.04 |
[python] 백준 - 1120 문자열 (0) | 2021.08.02 |