_Han_
나의 개발 노트
_Han_
  • 분류 전체보기 (272)
    • 데이터 엔지니어링 (29)
    • 인프라 (3)
    • 추천시스템 (11)
    • 코딩테스트 (146)
    • 부트캠프 회고 (15)
    • 회고 (4)
    • 자격증 (1)
    • 파이썬 프로그래밍 (6)
    • 통계 (2)
    • Git (21)
    • 유니티2D (33)

최근 글

반응형
hELLO · Designed By 정상우.
_Han_

나의 개발 노트

코딩테스트

[코딩테스트] 백준 비밀번호 발음하기 파이썬(Python)

2023. 2. 27. 16:39
반응형

https://www.acmicpc.net/problem/4659

 

4659번: 비밀번호 발음하기

좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp

www.acmicpc.net

def solve(test_case):
  #condition1
  for i in vowel:
    if i in test_case:
      break
  else:
    return False
  #condition2
  for i in range(len(test_case)-2):
    case = test_case[i:i+3]
    if condition2(case):
      pass
    else:
      return False
  #condition3
  for i in range(len(test_case)-1):
    case = test_case[i:i+2]
    if condition3(case):
      pass
    else:
      return False

  return True

def condition2(case):
  vowel_count = 0
  cons_count = 0
  for i in case:
    if i in vowel:
      vowel_count += 1
    if i in cons:
      cons_count += 1
  if vowel_count == len(case) or cons_count == len(case):
    return False
  return True

def condition3(case):
  if case == 'ee' or case == 'oo':
    return True
  if case[0] == case[1]:
    return False
  return True

def acceptable(word, flag):
  if flag:
    return f"<{word}> is acceptable."
  else:
    return f"<{word}> is not acceptable."


alphabet = [chr(c) for c in range(ord('a'), ord('z')+1)]
vowel = ['a','e','i','o','u']
cons = list(set(alphabet) - set(vowel))

while True:
  test_case = input()
  if len(test_case) == 1:
    if test_case in vowel:
      print(acceptable(test_case, True))
      continue
    else:
      print(acceptable(test_case, False))
      continue
  if test_case == 'end':
    break
  flag = solve(test_case)
  print(acceptable(test_case, flag))

solve()

먼저 solve()는 조건(condition) 1, 2, 3을 차례로 확인하면서 조건에 부합하지 않으면 False를 반환하고 모든 조건을 통과하면 True를 반환하는 함수입니다.

condition1

  • 조건 1 : 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.

먼저 조건 1에 해당하는 알고리즘입니다.

 for i in vowel:
    if i in test_case:
      break
  else:
    return False

각 모음이 담겨있는 vowel리스트를 확인하면서 test_case에 모음이 들어있다면 반복문을 break로 탈출합니다.

  • 이때 break문으로 탈출하지 못하면 else로 인하여 False를 반환합니다.

condition2()

  • 조건 2 : 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.

먼저 반복문을 통하여 test_case의 연속된 3개의 문자 case를 추출합니다.

다음 아래의 condition2()함수를 호출합니다.

def condition2(case):
  vowel_count = 0
  cons_count = 0
  for i in case:
    if i in vowel:
      vowel_count += 1
    if i in cons:
      cons_count += 1
  if vowel_count == len(case) or cons_count == len(case):
    return False
  return True

코드는 연속된 3개의 문자 case의 각 문자들을 확인하면서 case가 모음이 3개인지, 자음이 3개인지 판별합니다.
이때 모음 혹은 자음이 3개라면 False를 반환하고 아니라면 True를 반환합니다.

condition3()

  • 조건 3 : 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.

condtion3 또한 먼저 반복문을 통하여 test_case의 연속된 2개의 문자 case를 추출합니다.

def condition3(case):
  if case == 'ee' or case == 'oo':
    return True
  if case[0] == case[1]:
    return False
  return True

case가 ee 혹은 oo 라면 True를 반환합니다.
그리고 두개의 문자가 동일하면 False를 반환하고 아니라면 True를 반환합니다.

while

마지막으로 while문을 확인하겠습니다.

먼저 아래의 두 리스트를 초기화합니다.

  • vowel : 모음을 모아놓은 리스트
  • cons : 자음을 모아놓은 리스트

test_case의 문자의 길이가 1인 경우에 해당 문자가 모음이라면 is acceptable. 아니라면 is not acceptable.을 출력하고 다음 test_case로 넘어갑니다.

 

그 다음 flag를 통하여 위의 조건들을 부합하였는지 판단하고
부합하였다면 is acceptable. 을 출력하고, 부합하지 않았다면 is not acceptable. 출력합니다.

반응형

'코딩테스트' 카테고리의 다른 글

[코딩테스트] 프로그래머스 정수 삼각형 파이썬(Python)  (0) 2023.03.02
[코딩테스트] 백준 영단어 암기는 괴로워 파이썬(Python)  (0) 2023.02.28
[코딩테스트] 프로그래머스 대충 만든 자판 파이썬(Python)  (0) 2023.02.27
[코딩테스트] 백준 안전 영역 파이썬(Python)  (0) 2023.02.25
[코딩테스트] 프로그래머스 가장 먼 노드 파이썬(Python)  (0) 2023.02.23
    '코딩테스트' 카테고리의 다른 글
    • [코딩테스트] 프로그래머스 정수 삼각형 파이썬(Python)
    • [코딩테스트] 백준 영단어 암기는 괴로워 파이썬(Python)
    • [코딩테스트] 프로그래머스 대충 만든 자판 파이썬(Python)
    • [코딩테스트] 백준 안전 영역 파이썬(Python)
    _Han_
    _Han_
    학습한 것을 기록합니다.

    티스토리툴바