본문 바로가기
Algorithm/구현

[Python3] 백준 1296번 팀 이름 정하기

by HANNI하니 2023. 1. 6.

1296번: 팀 이름 정하기 (브론즈1, 구현)

문제

 

1296번: 팀 이름 정하기

연두는 프로그래밍 대회에 나갈 팀 이름을 정하려고 한다. 미신을 믿는 연두는 이환이에게 공식을 하나 받아왔고, 이 공식을 이용해 우승할 확률이 가장 높은 팀 이름을 찾으려고 한다. 이환

www.acmicpc.net

정답

특정 문자열 찾아서 count하는 문제!

내 풀이 방식은 count를 사용안한 형태이다. 250번은 시도해서 정답은 맞추었다 ㅎㅎ 100줄 코딩한거 오랜만이었다.

(내 정답 풀이)

1. 입력 형태는 똑같다. sort를 사용해서 team이름을 사전순으로 정리한다.

2. 연두이름에서 LOVE를 찾아서 L,O,V,E 리스트에 넣어서 sum으로 총 개수를 구한다.

각 문자열의 index를 뽑았을 때 한개도 없어 오류가 발생하는 경우는 except를 활용하여 0을 append하게 했다.

name_L,name_O,name_V,name_E 에 저장

3. 위와 같은 방식으로, 각 팀 이름에서 LOVE의 총 개수를 구한다.

이때 L,O,V,E는 재사용해서 리셋해서 사용했고, 이중반복문을 활용했다.

team_L,team_O,team_V,team_E 에 저장

4. 각 팀의 L,O,V,E 전체 개수를 구하여 확률을 구했다. 이를 cnt 빈 리스트에 append했다.

5. max(cnt)를 구해서 index에 맞는 team을 출력한다.

앞서서 sort되었기 때문에 max만 구하면 사전순으로 앞선 팀 이름이 출력된다.

# 내 정답
name = input().upper() # 연두의 영어 이름
N = int(input()) # 팀이름 후보 개수
team = [] #팀이름 후보
for _ in range(N):
    num = input().upper()
    team.append(num)

team.sort() #팀 이름 사전순으로 정렬
# LOVE 개수
L = []
O = []
V = []
E = []

# 연두 이름에서 LOVE 개수 찾기
for i in range(len(name)):
    try :
        if name[i].index('L') >= 0:
            L.append(1)
    except:
        L.append(0)
    
    try:
        if name[i].index('O') >= 0:
            O.append(1)
    except:
        O.append(0)
    
    try:
        if name[i].index('V') >= 0:
            V.append(1)
    except:
        V.append(0)
        
    try:    
        if name[i].index('E') >= 0:
            E.append(1)
    except:
        E.append(0)

name_L = sum(L)
name_O = sum(O)
name_V = sum(V)
name_E = sum(E)

cnt = [] #각 팀이름 별 최종 확률 구하기

# 팀 이름에서 LOVE 개수 찾기
for j in range(N): #각 팀별
    
    L = []
    O = []
    V = []
    E = []
    for i in range(len(team[j])): #팀 이름 하나씩
        try :
            if team[j][i].index('L') >= 0:
                L.append(1)
        except:
            L.append(0)
        
        try:    
            if team[j][i].index('O') >= 0:
                O.append(1)
        except:
            O.append(0)
            
        try:
            if team[j][i].index('V') >= 0:
                V.append(1)
        except:
            V.append(0)
            
        try:
            if team[j][i].index('E') >= 0:
                E.append(1)
        except:
            E.append(0)
            
    team_L = sum(L)
    team_O = sum(O)
    team_V = sum(V)
    team_E = sum(E)
    
    total_L = name_L + team_L
    total_O = name_O + team_O
    total_V = name_V + team_V
    total_E = name_E + team_E
            
    # 확률 구하기
    answer = ((total_L+total_O)*(total_L+total_V)*(total_L+total_E)
              *(total_O+total_V)*(total_O+total_E)*(total_V+total_E))%100
    cnt.append(answer)

# 우승확률이 가장 높은 팀 index
print(team[cnt.index(max(cnt))])

 

<내가 생각하지 못한 아이디어>

1. 공식에서 "%100"으로 나머지를 구하기 때문에 0보다 작은 경우를 고려했다.

공식 결과가 0보다 클 경우 max_p를 결과로 업데이트하고, max_i를 i로 업데이트하여 결과를 출력할 때 인덱스로 사용했다.

다만 의문은 내 풀이과정에선 0보다 작을 경우를 고려하지 않았는데도 정답으로 처리된 것일까?

밑의 코드에서는 0보다 작을 경우를 고려하지 않으면 오답으로 나온다.

아! 

가장 큰 값으로 계속 업데이트를 해줘서 max값을 찾는 것!

map_p를 계속 가장 큰 p로 업데이트 해주는 형태였다.

나의 정답에선 sorted 된 걸 max로 찾아주었기 때문에 이러한 과정이 필요없던 것이었다.

 

2. 굳이 for문을 써서 한 단어의 첫번째부터 마지막 알파벳까지 하나씩 L,O,V,E index를 찾지 않아도 된다.

count를 사용하면 총 개수를 알려준다.

# 보통 사람들의 정답

name = input()
N = int(input())
team = sorted([input() for i in range(N)])
max_p = max_i = 0

for i in range(N):
    L = name.count("L") + team[i].count("L")
    O = name.count("O") + team[i].count("O")
    V = name.count("V") + team[i].count("V")
    E = name.count("E") + team[i].count("E")
    p = ((L+O)*(L+V)*(L+E)*(O+V)*(O+E)*(V+E)) % 100
    
    if max_p < p:
        max_p = p
        max_i = i
print(li[max_i])

 

내 풀이 방식은 코드 길이는 4배 길고, 시간도 4ms 더 많이 걸린다. 알고리즘으로 간소화하기를 연습하자..

더 머리를 써보자..ㅠㅠ

(위) 내 풀이 (아래) 보통 정답

 

공부한 내용

1. 파이썬에서 mod 함수는 %와 같다.

mod 100 == %100

=> 100으로 나눴을 때의 나머지

 

2. sorted( [input() for i in range(n)] )

리스트를 지정하면서 바로 sorted 해버리자! 코드 간소화 중요!!!

난 list 지정하고, 그다음에 sort했다. 이렇게 되면 입력한 team이 정렬되어 바뀐다.

list명.sort()  => 알파벳 순서로 문자열 정리

sorted를 사용해서 입력한 team 명의 순서는 바꾸지 않고, 새 리스트를 반환하는 게 더 정답이었다.

 

 3. count 함수는 대소문자 구분된다.

모두 upper나 lower로 바꿔야 정확한 count를 구할 수 있다.

 

 


레퍼런스

  • 공부한 내용
 

01-05. 나머지 (mod, rmod)

####DataFrame.mod(other, axis='columns', level=None, fill_value=None) ####DataFrame.rmod(other, axi…

wikidocs.net

 

Python - 알파벳 순서로 문자열 정렬

파이썬에서 알파벳 순서로 문자열을 정렬하는 방법을 소개합니다. `list.sort()`는 대문자에서 소문자 순서로, 알파벳 순서로 정렬합니다. 대문자를 소문자로 변경하고, 그 리스트를 정렬할 수 있

codechacha.com

  • 깃허브 정답
 

GitHub - yyeongeun/codingtest: 코딩테스트 공부

코딩테스트 공부. Contribute to yyeongeun/codingtest development by creating an account on GitHub.

github.com

 

댓글