코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.

코딩테스트 정보




문제

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 “aya”, “ye”, “woo”, “ma” 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 “aya”, “ye”, “woo”, “ma”는 각각 최대 한 번씩만 등장합니다.
    • 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 “aya”, “ye”, “woo”, “ma”가 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

입출력 예

babbling result
[“aya”, “yee”, “u”, “maa”, “wyeoo”] 1
[“ayaye”, “uuuma”, “ye”, “yemawoo”, “ayaa”] 3




풀이 코드

풀이 코드 1 (2023-01-16)

time : 0.02ms ~ 0.23ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(babbling):
    answer = []
    bab = ["aya", "ye", "woo", "ma"] 
    
    for i in bab:
        babbling = [ x.replace(i, '1') for x in babbling]
    
    for i in babbling:
        try:
            answer.append(int(i))
        except:
            pass
    
    return len(answer)

풀이 코드 2 (2023-01-18)

time : 0.01ms ~ 0.08ms

1
2
3
4
5
6
7
8
9
10
def solution(babbling):
    
    bab = ["aya", "ye", "woo", "ma"] 
    
    for i in bab:
        babbling = [ x.replace(i, ' ') for x in babbling]
        
    babbling = [ x.strip() for x in babbling ]
    
    return babbling.count('')




풀이 방식

■■■■ 문제 요약 ■■■■

주어진 strings 중 “aya”, “ye”, “woo”, “ma” (이하:bab) 를 한 번씩만 사용하여 만들 수 있는 string의 갯수를 구하라.

■■■■ 하드 풀이 ■■■■

babbling = [“aya”, “yee”, “u”, “maa”, “wyeoo”]
(1) aya : 그냥 가능
(2) yee : ye는 가능하나, 남은 e는 불가
(3) u : 불가
(4) maa : ma는 가능하나, 남은 a는 불가
(5) wyeoo : 중간의 ye는 가능하나, 따로 떨어진 woo는 불가

■■■■ 접근 방식 ■■■■

(1) string에서 bab의 원소로 대체할 수 있는 부분을 찾는다.
(2) 대체할 수 있는 부분은 다른 char 혹은 int, 공백 등으로 replace 한다.
(3) string들 중 2번에서 지정한 char, int, 공백인 원소의 개수를 count 한다.

■■■■ 핵심 계산식 서술 ■■■■ (1번 풀이 기준)

(1) string에서 bab의 원소로 대체할 수 있는 부분 찾아 ‘1’로 replace

1
2
for i in bab:
	babbling = [ x.replace(i, 1) for x in babbling]

(2) replace된 babbling에서 int화 할 수 있는 원소만 찾아 answer 리스트에 담기

1
2
3
4
5
for i in babbling:
	try:
		answer.append(int(i))
	except:
		pass

(3) answer 리스트의 원소 개수를 답으로 반환

1
return len(answer)

■■■■ 핵심 계산식 서술 ■■■■ (2번 풀이 기준)

(1) string에서 bab의 원소로 대체할 수 있는 부분 찾아 공백으로 replace

1
2
for i in bab:
	babbling = [ x.replace(i, ' ') for x in babbling]

(2) babbling에서 양쪽에 있는 공백 제거 (두 번 이상 replace 되는 상황 대비)

1
babbling = [ x.strip() for x in babbling ]

(3) babbling 원소 중 공백인 것의 개수를 답으로 반환

1
return babbling.count('')




리뷰

  • 풀이 간 실행속도 차이 : try-exception, int() 메서드가 실행속도를 저하시키는 것으로 보임