log.Sehee
TIL / 5/3 / 백준 - 10815 숫자카드 본문
문제
https://www.acmicpc.net/problem/10815
상근이가 가지고 있는 숫자카드에 적혀있는 정수와 랜덤으로 주어지는 숫자카드 N개에 적혀있는 정수를 비교하여 N개의 카드 중 상근이가 가지고 있는 카드는 1을, 가지고 있지 않는 카드는 0으로 출력해라.
시도
# 입력값 = 3
# 1 3 5
# 5
# 1 2 3 4 5
h_card = input()
h_int_list = list(map(int,(input().split())))
c_card = input()
c_int_list = list(map(int,(input().split())))
이 코드와 입력값은 디폴트로 쓰였다
첫 번째 시도
n = []
for i,h in enumerate(h_int_list):
for i_c,c in enumerate(c_int_list):
if h == c :
del(h_int_list[i])
c_int_list[i] = 1
else: c_int_list[i] = 0
print(c_int_list)
# [1, 2, 3, 4, 5]
# [0, 2, 3, 4, 5]
# [0, 2, 3, 4, 5]
# [0, 2, 3, 4, 5]
# [0, 2, 3, 4, 5]
# [0, 0, 3, 4, 5]
h_int_list와 c_int_list의 0번째 인덱스의 원소가 1로 같았기 때문에 c_int_list의 원소를 1로 변환.
그 다음 for문에서 문제가 발생.. c_int_list[0]은 이미 중복된 값이라 1로 처리가 된 것인데..
h인 2와 c_int_list[0]부터 대조를 시작하니 if문에서 else처리가 되는 것..
이렇게 되면 결국 리스트의 모든 원소가 0으로 만들어지게 된다
두 번째 시도
while i < c_card :
for h in h_int_list:
for i_c,c in enumerate(c_int_list):
if h in c_int_list:
c_int_list[i_c]=1
del(h_int_list[h])
else:
i += 1
print(c_int_list)
이 코드는 c_int_list에서 h_int_list의 원소와 겹치는 것을 찾고,
h_int_list에서 for문으로 돌려진 원소를 지워버릴 생각으로 쓴 식이지만 out of range의 오류가 뜬다..
어차피 다시 생각해보니 이게 해결 방법이 아닌 것 같아서 패스
해결
# 런타임에러
h_card = input()
h_int_list = list(map(int,(input().split())))
c_card = int(input())
c_int_list = list(map(int,(input().split())))
list_set = list(set(h_int_list) & set(c_int_list))
for c in c_int_list:
if c in list_set:
print(1,end=' ')
else: print(0,end=' ')
문제에서 제시한 예제는 통과했지만 제한사항에 나와있던 숫자카드의 범위 때문에 런타임에러가 떴다.
숫자카드의 범위는 -10,000,000 =< N =< 10,000,000 이였기 때문에 원소 하나 하나씩 비교하거나, 빈 리스트에 append로 값을 담거나 하는 방식은 시간복잡도에서 탈락일 것 같았지만.. 달리 방식이 생각나지 않았기 때문에..
비교군을 최소한으로 줄일 수 있는 set을 사용하여 교집합을 구한 뒤 c_int_list에 교집합에 포함된 원소가 나올 때 마다 print 1, 나오지 않을 때는 print 0을 해주고, 둘 다 end=' '을 붙여 공백을 사이에 둔 한 줄의 출력문으로 만들었다.
'상근이가 가지고 있는 카드의 갯수'와 '랜덤으로 주어져 출력문으로 도출해야하는 카드의 갯수'를 받았으니 활용해보려 시도했지만 대부분의 상황에서 굳이 써야하나.. 싶은 수였기 때문에 방도가 떠오르지 않았다.
저녁 시간에 팀원 분들과 코드 리뷰를 하면서 팀장님이 수의 범위가 넓으니 딕셔너리를 사용하는 것이 맞는 것 같다고 해주셔서 다른 팀원 분이 딕셔너리를 사용하셔서 바로 풀어내셨다!
h_int_list에 len, range를 사용하여 길이를 재고, for문으로 원소 하나씩 딕셔너리에 키:밸류 형태로 넣어 바로 값을 찾아낼 수 있는 방법이라고 하셨다.
배운 점
알고리즘 문제를 풀 때 딕셔너리를 활용한 적이 한 번도 없었어서 이번에 정말 생각치도 못했던 것 같다.
JSON의 파일형식이 딕셔너리인 것도 대량의 데이터를 관리하기 위해서는 키,밸류 형태로 값을 찾아내는 것이 훨씬 빠르기 때문이라는 것을 이번에 확실히 느꼈다.. '검색'같은 경우에는 딕셔너리가 시간복잡도에서 훨씬 우수하다고 한다.
사실 아직도 튜플과 리스트 등등.. 그저 내 식을 방해하는 배열의 타입 정도로 여겼는데.. 여러 방면의 지식이 필요하단 것을 다시 느꼈다ㅎㅎ..
나만의 작은 꼬북튜터님 TDMI.. To Day Much Information..
돌아왔다 TDMI.. ;p
꼬북튜터님은.. 이번 5기 튜터활동을 마치신 후
대학원에 들어가신다고 한다...
안돼요 저 재수강할거에요... ʕ ´•̥̥̥ ᴥ•̥̥̥`ʔ