알고리즘

💻 [백준][파이썬] 단계별로 풀어보기 - 집합과 맵(10815, 14425, 7785, 1269, 11478)

sehee00 2024. 12. 9. 17:32

정답률이 너무 낮은 문제는 풀지 않았다.

 

 

10815 숫자 카드 

import sys
input = sys.stdin.readline

N = int(input())
my_arr = set(map(int, input().split()))  # 리스트를 집합으로 변환

M = int(input())
serch_arr = list(map(int, input().split()))

# 기존 정렬과 비교하면서 일치하면 1 아니면 0 
result = [1 if num in my_arr else 0 for num in serch_arr]
print(' '.join(map(str, result)))
  • 리스트 컴프리헨션: 리스트를 순회하며 가지고 있으면 1을, 아니면 0을 출력 
# 리스트 컴프리헨션 
result = [1 if num in my_arr else 0 for num in my_arr]

# 풀어서 쓰면 
result = []
for num in serch_arr:  # serch_arr의 각 요소를 순회
    if num in my_arr:  # my_arr에 num이 있으면
        result.append(1)  # 1을 추가
    else:  # 없으면
        result.append(0)  # 0을 추가

 

⚠️ 에러 

  • 제출 결과: 시간 초과 
N = int(input())
my_arr = list(map(int, input().split()))

# 중복 제거 후 정렬 
sorted_arr = sorted(set(my_arr))
  • 정렬한 집합이 어디에도 쓰이지 않고 불필요해서 아래와 같이 수정했다. 
# 리스트를 집합으로 변환
my_arr = set(map(int, input().split()))

 

 

14425 문자열 집합

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
my_arr = []
search_arr = []

for _ in range(N):
    my_arr.append(input())

for _ in range(M):
    search_arr.append(input())

cnt = 0 
for word in search_arr:
    if word in my_arr:
        cnt += 1 

# 리스트 컴프리헨션으로 하면 
cnt = sum(1 for word in search_arr if word in my_arr)
 
print(cnt)
  • Enter로 입력 : arr.append(input())으로 입력받아야함 !!!!

 

💡 딕셔너리 

# 딕셔너리 기본 모습 
{Key1: Value1, Key2: Value2, Key3: Value3, ...}

# 예제 
a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}

a.keys() # dict_keys(['name', 'phone', 'birth'])
a.values() # dict_values(['pey', '010-9999-1234', '1118'])
a.items() # dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])

a.get('name')  # 'pey'
a.get('phone')  #'010-9999-1234'

 

7785 회사에 있는 사람 

import sys
input = sys.stdin.readline

N = int(input())
temp = dict() # 딕셔너리 형 

for _ in range(N):
    a, b = map(str, input().split())

    # 출입
    if b == 'enter':
        temp[a] = b
    # 퇴근시 삭제 
    else:
        del temp[a]

# 사전 순의 역순으로 정렬 
temp = sorted(temp.keys(), reverse=True)

print("\n".join(temp))
  • 딕셔너리 형으로 입력받는게 포인트
  • 역순으로 정렬 reverse=True

 

💡 집합 자료형 

# 집합 자료형 
# 특징: 중복 허용 X, 순서 X 
s = set() 

# 교집합, 합집합, 차집합 구하기 
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

s1 & s2  # {4, 5, 6}
s1.intersection(s2)  # {4, 5, 6}

s1 | s2  # {1, 2, 3, 4, 5, 6, 7, 8, 9}
s1.union(s2)  # {1, 2, 3, 4, 5, 6, 7, 8, 9}

s1 - s2  # {1, 2, 3}
s1.difference(s2)  # {1, 2, 3}
s2 - s1  # {8, 9, 7}
s2.difference(s1)  # {8, 9, 7}


# 집합 자료형 관련 함수
s1 = set([1, 2, 3])

s1.add(4)  # {1, 2, 3, 4}
s1.update([4, 5, 6])  # {1, 2, 3, 4, 5, 6}
s1.remove(2). # {1, 3}

 

1269 대칭 차집합  

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
# 집합 연산은 set 자료형 사용 
A = set(map(int, input().split()))
B = set(map(int, input().split()))

print(len(A-B) + len(B-A))
  • 집합 연산은 set() 자료형 사용 

 

11478 서로 다른 부분 문자열의 개수 

import sys
input = sys.stdin.readline

S = input().strip()
word = set()

for i in range(len(S)):
    for j in range(i, len(S)):
        word.add(S[i:j+1])

print(len(word))