[Python] 백준 1157 | 단어 공부 : 리스트 복사, remove(), upper(), count()

heige·2023년 12월 5일
0

BOJ

목록 보기
14/46
post-thumbnail

문제

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

업로드중..

풀이

방법 1(보류)

  • 단어를 대문자로 변환하여 리스트로 입력 받는다.
  • 알파벳 26개의 개수를 카운트 할 리스트(cntS) 생성
  • S의 알파벳을 비교하며 cntS에 숫자 카운트
  • cntS를 복사하고(cntS_dup), 0을 제거
    복사하는 이유 - cntS는 알파벳 출력할 때 인덱스로 써야 해서 놔두고, 따로 복사
  • 단어 S의 중복 제거한 길이와 cntS_dup의 길이 비교
    최빈값의 중복이 없음을 확인
    최빈값 출력
S = list(input().upper()) #대소문자 변환
Al = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cntS = [0] * len(Al)
for i in range(len(S)) :
    for j in Al :
        if S[i] in j :
            cntS[Al.index(j)] += 1
cntS_dup = list(cntS)
while 0 in cntS_dup :
    cntS_dup.remove(0)
if len(set(S)) == len(set(cntS_dup)):
    print(Al[cntS.index(max(cntS))])
else :
    print("?")

예제는 다 실행됐으나 백준에선 틀렸다고 채점이 나옴..
그래서 반례를 찾을 때까지 보류ㅠㅠㅠㅠ
하 얼마나 잡고 있었는지.

💡 해결됨!!! 반례 찾음

Input:
ABCDEFGHIJKLMNOPQRSTUVWXYZA

Output:
?
    
Correct output:
A
# 수정된 코드
S = list(input().upper()) 
Al = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cntS = [0] * len(Al)
for i in range(len(S)) :
    for j in Al :
        if S[i] in j :
            cntS[Al.index(j)] += 1
cntS_dup = list(cntS)
if cntS_dup.count(max(cntS)) == 1 :
    print(Al[cntS.index(max(cntS))])
else :
    print("?")

count() 메소드 쓰면 cntS 복사해서 0 제거할 필요 없음

방법 2

그래서 새로운 풀이. 훨씬 간단하다(보편적으로 이렇게 푸는 듯)

  • S를 대문자로 변환하여 입력 받음
  • S의 중복을 제거한 리스트를 만들어줌
  • S_list의 요소에 대해서, 문자열 S의 요소를 카운트 하여 cnt 리스트에 append 해준다.
  • cnt에서 최댓값(단어에서 제일 많이 나온 알파벳의 개수)이 1개가 아니라 2개 이상일 때는 '?' 출력
  • else, 최빈값의 알파벳 출력
S = input().upper()
S_list = list(set(S))
cnt = list()
for i in S_list :
    cnt.append(S.count(i))
if cnt.count(max(cnt)) > 1 :
    print("?")
else :
    print(S_list[cnt.index(max(cnt))])

💡 배운 내용

리스트 복사하는 방법

리스트의 내용을 복사해서 새로운 변수에 넣고 싶을 때, 그냥 복사하면 안 되냐 생각할 수 있다.

list1 = [1, 2, 3, 4]
list2 = list1

print(list1)
>>> [1, 2, 3, 4]
print(list2)
>>> [1, 2, 3, 4]

위를 보면 잘 복사됐다고 생각할 수 있지만 아님. 주의해야 한다.
정확히 말하면 list2는 list1의 메모리 주소값을 복사한 것이다. 즉, 같은 메모리를 참조하기 때문에 list1이 수정되면 list2도 동시에 수정된다.

결국 복사가 이뤄지기 위해서는 list1와 list2이 서로 다른 메모리를 참조하도록 해주면 된다. 파이썬 리스트를 다른 리스트에 복사하는 방법은 4가지가 있다.

슬라이싱

list1 = [1, 2, 3, 4]
list2 = list1[:]

list() 함수

list1 = [1, 2, 3, 4]
list2 = list(list1)

copy() 메소드

list1 = [1, 2, 3, 4]
list2 = list1.copy()

리스트 연산

list1 = [1, 2, 3, 4]
list2 = [] + list1

remove()

리스트의 메소드.

li = [1, 3, 5, 7, 9]
li.remove(5)
print(li)
[1, 3, 7, 9]

lower(), upper()

  • 가끔 소문자, 대문자로 출력하라는 문제가 나온다.
  • 대소문자 구분없이 비교하려면 소문자나 대문자로 통일한 후 비교해야하는 경우가 많다. 
s = "Hello World"
lowercase =s.lower()
print(lowercase)
uppercase = s.upper()
print(uppercase)
hello world
HELLO WORLD

count()

문자열, 리스트, 튜플, 집합 등에서 사용 가능함

a = [1, 1, 1, 2, 3]
a.count(1)

['a', 'b', 'c', 'abc'].count('abc')
3
1
profile
웹 백엔드와 클라우드 정복을 위해 탄탄한 기반을 쌓아가고 있는 예비개발자입니다. 'IT You Up'은 'Eat You Up'이라는 표현에서 비롯되어, IT 지식을 끝까지 먹어치운다는 담고 있습니다.

0개의 댓글