ALGORITHM/PYTHON

백준 BAEKJOON 31832번 팀명 정하기 2 [PYTHON/파이썬]

칼코
반응형

 

 

 

 

 

백준 BAEKJOON 31832번 팀명 정하기 2 [PYTHON/파이썬]


<문제 출처> (BRONZE Ⅱ)

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

 

 

 

 

 

 

 

<풀이>

처음엔 for 문 안에서 세 가지 조건을 다 대입하려다가

조건이 꼬여서 히든 케이스를 잡지 못했다.

결국에는 조건 하나하나마다 함수를 만들어서 풀게 되었다.

함수를 통해 세 가지 조건 모두 참인 팀명이 정답이 되는 것이다.

 

알파벳 대문자, 알파벳 소문자, 숫자, 하이픈의 아스키코드는 각각 65-90, 97-122, 48-57, 45이다.

 

첫 번째 조건, 대문자가 소문자보다 많으면 안 된다.

결국 소문자는 대문자보다 크거나 같아야 한다.

나는 for 문과 ord 함수를 사용하여 대문자와 소문자 개수를 파악하였다. 

 

두 번째 조건, 팀명은 10글자 이하여야 한다.

이 조건은 단순하게 len 함수를 통해 문자열의 길이를 구하면 된다.

 

세 번째 조건, 숫자가 아닌 글자가 하나 이상 포함되어야 한다.

만약 히든 케이스로 하이픈(-)만 들어간 팀명이 있다고 생각해 보자 (예: '-----')

이 팀명도 조건에 부합하여서 정답이 된다.

나는 단순히 for문을 통해서 문자가 있는지 없는지 파악하기 위해

숫자에 해당하는 아스키코드(48~57) 범위 이외의 것들이 있는지 확인했다.

있으면 True, 없으면 False를 return 하였다.

 

 

 

 

 

 

 

 

<코드>

# 알파벳 대문자, 알파벳 소문자, 숫자, 하이픈의 아스키코드는 각각 65-90, 97-122, 48-57, 45이다.


# 첫 번째 조건
def conditionOne(teamName):
    upperCase, lowerCase = 0, 0
    for i in teamName:
        if 65 <= ord(i) <= 90:
            upperCase += 1
        elif 97 <= ord(i) <= 122:
            lowerCase += 1

    return lowerCase >= upperCase


# 두 번째 조건
def conditionTwo(teamName):
    return len(teamName) <= 10


# 세 번째 조건
def conditionThree(teamName):
    letterCheck = False
    for i in teamName:
        if ord(i) < 48 or ord(i) > 57:
            letterCheck = True
    return letterCheck


N = int(input())
result = ""

for _ in range(N):
    S = input()

    if conditionOne(S) and conditionTwo(S) and conditionThree(S):  # 세 조건 모두 참이면
        result = S


print(result)

 

 

 

 

 

 

 

반응형