def alternate(s):
# Write your code here
result_list = []
def gen_comb(arr,n):
result = []
if n == 0:
return [[]]
for i in range(len(arr)):
element = arr[i]
rest_arr = arr[i+1:]
for c in gen_comb(rest_arr,n-1):
result.append([element]+c)
return result
def validate(arr):
length = len(arr)
if length >=2:
first, second = arr[0],arr[1]
for j in range(length):
if j%2 == 0 and arr[j] != first:
return False
if j%2 == 1 and arr[j] != second:
return False
return True
else:
return True
char_list = list(s) # [b,e,a,b,e,e,f,e,a,b]
char_set = set(char_list) # {a,b,e,f}
set_to_arr = list(char_set) # [a,b,e,f]
com_list = gen_comb(set_to_arr,2)
#[['a', 'b'], ['a', 'e'], ['a', 'f'], ['b', 'e'], ['b', 'f'], ['e', 'f']]
for i in com_list: # ['a','b']
temp_string = char_list.copy() # [b,e,a,b,e,e,f,e,a,b]
append_string = []
for j in range(len(temp_string)):
if temp_string[j] in i:
append_string.append(temp_string[j])
result_list.append(append_string)
result_list = [x for x in result_list if validate(x)]
#[['b', 'e', 'b', 'e', 'e', 'e', 'b'], ['b', 'a', 'b', 'a', 'b'], ['e', 'a', 'e', 'e', 'e', 'a'], ['b', 'b', 'f', 'b'], ['e', 'e', 'e', 'f', 'e'], ['a', 'f', 'a']]
result = [len(x) for x in result_list]
if len(result) >= 1:
solution = max(result)
else:
solution = 0
return solution
이번 문제는 주어진 문자열에 존재하는 문자 중 2개만 남겼을 때, 두가지 값이 반복되는 형태의 문자열 중에서 가장 길이가 긴 문자열의 길이를 구하는 문제이다.
처음에 문제를 이해를 하기 어려워서 예제에 대한 설명을 읽었는데, 그 설명 그대로 구현하니 풀 수 있었다.
먼저 주어진 문자열에 존재하는 문자의 종류를 알기 위해 set 자료형과 list 자료형을 사용하였고, 2가지를 선택하는 경우의 수를 구하기 위하여 조합을 구하는 함수(gen_comb)를 만들었다.
또한 2가지만 남겼을 때 값이 번갈아가는지 검증하기 위한 함수(validate)를 구현하여 리스트 컴프리핸션을 통해 최종적인 답을 구할 수 있었다.
이번 문제를 풀면서 느낀 점은 다음과 같다 :)
- 문제의 로직이 복잡할 경우에는 print를 찍어보면서 해당 값을 주석으로 남기면서 풀자.(헷갈리는 것을 방지)
- 문제를 효율적으로 풀기 위해서는 set, list, dict 자료형을 적극적으로 활용하고 최대한 로직을 함수화하자.
- 문제가 제대로 이해가지 않는다면 문제의 예제를 유심히 살펴보자.
'Algorithm 💡 > String' 카테고리의 다른 글
[프로그래머스] 숨어있는 숫자의 덧셈(2) (0) | 2023.07.20 |
---|---|
[프로그래머스] OX퀴즈 (0) | 2023.07.20 |
[프로그래머스] 문자열 계산하기 (0) | 2023.07.20 |
[프로그래머스] 옹알이(1) (0) | 2023.07.18 |
[HackerRank] Caesar Cipher (0) | 2023.05.19 |