문제 링크 / level: Bronze II
배열에 관한 문제인데, 여러 가지를 연습해볼 수 있을 것 같아서 도전해봤다.
문제를 풀어본 결과 몇 가지 공부포인트가 있었다.
1. 배열을 선언하고, 길이를 지정하고, 10개의 데이터를 받는 과정
2. 나머지 연산 (이건 Java에서의 연산과 같다.)
nums = [0] * 10
for i in range(10):
nums[i] = int(input()) % 42
내가 깨작깨작 했던 공부로는 코드를 이렇게 짜볼 수 있었다.
그리고 저 코드를 돌리고 백준 입력값을 넣어보면, 우선은 문제에서 요구하는 대로 입력받은 수를 42로 나눈 나머지 값들이 저장된 배열이 출력된다.
이제 여기서 서로 다른 값이 몇 개 있는지를 찾아야하는데 여기서 Python의 위력을 느낄 수 있었다.
from collections import Counter
이거 한 줄이면 내가 일일이 비교할 필요 없이 손쉽게 원하는 값을 얻을 수 있다.
collections 모듈의 Counter 클래스 (collections.Counter) 라고 하는데, 좀 더 자세한 내용은 공부해서 Python3 개념 게시판에 적을 예정이다.🤗
참고링크
아무튼 이 킹-갓-제너럴 Counter가 있으면
print(len(Counter(nums)))
이 한 줄로 '서로 다른 값을 가진 원소의 개수'를 알 수 있다. 이 말이다. (이게 바로 Python인가,,,😂👍)
참고로 Counter의 결과는 딕셔너리 형태로 리턴된다고 한다. 그래서 어디선가 들어는 봤지만 정확히 기억나지 않는 딕셔너리의 개념에 대해서도 살짝 공부해봤다. key와 value 값을 쌍으로 가지는 자료형이다. 잘 알아두도록 하자.
참고링크
- https://wikidocs.net/16
- https://www.daleseo.com/python-collections-counter/
- https://excelsior-cjh.tistory.com/94
그리하여
가볍게 문제를 맞힐 수 있었다.
💙전체코드💛
from collections import Counter
nums = [0] * 10
for i in range(10):
nums[i] = int(input()) % 42
print(len(Counter(nums)))
그런데 아직 익숙해지는 과정이라 다른 사람들의 코드도 좀 찾아봤더니…
nums = []
for _ in range(10):
num = int(input()) % 42
nums.append(num)
이런 식으로 _ (Python에서는 이를 언더스코어(Underscore)라고 하는 듯하다) 를 사용하면 변수를 굳이 넣지 않고, 즉, 값을 무시하고 로직을 수행할 수 있는 것 같다.
참고링크
이렇게 코드를 짜면 내가 nums = [0] * 10으로 배열 초기화 및 길이 지정해줬던 과정이 사라진다. 대신, 위 코드에서는 nums.append(num)라는 코드가 한 줄 추가되어서 좀 더 번거로워졌다고 생각할 수도 있는데😅
nums = []
for _ in range(10):
num = int(input()) % 42
if num not in nums:
nums.append(num)
print(len(nums))
이런 식으로 if문을 하나 더 추가해주면 오히려 collections.Counter의 도움 없이도 손쉽게 문제를 해결할 수 있게 된다.
위 방법으로 다시 문제를 해결한 결과,
내가 처음에 풀었던 방법보다 메모리, 시간 모두 절약할 수 있었다. (역시 사람은 머리를 써야하나봐😂)
이쯤 되니.. 이 문제를 풀면서 공부한 내용을 가지고 짱구를 굴려서 응용을 해보고 싶어졌다.
from collections import Counter
nums = [int(input()) % 42 for _ in range(10)]
print(len(Counter(nums)))
그래서 좀 더 찾아봤더니 입력을 nums = [int(input()) % 42 for _ in range(10)] 이런 식으로 한 줄에 다 받을 수도 있었다. (Python 강려크함 무엇,,?🤔)
내친 김에 이렇게 입력 받고 문제를 풀어서 결과를 봤는데,
안타깝게도(?) 속도는 여태까지 3가지 코드 중에 가장 느렸다. 그래도 길이는 가장 짧았다^_^
덕분에 새로운 입력방법을 알았으니 아무튼 하나 얻어갑니다.😏✌
- 뿌듯하게 마무으리🌷 -
'🥇Problem Solving (psS2mj) > BOJ' 카테고리의 다른 글
[BOJ] 11721. 열 개씩 끊어 출력하기 (Python3) (0) | 2021.04.20 |
---|---|
[BOJ] 5543. 상근날드 (Python3) (0) | 2020.09.12 |
[BOJ] 2588. 곱셈 (Python3) (0) | 2020.09.01 |
[BOJ] 1000. A+B (Python3) (0) | 2020.09.01 |
[BOJ] 2740. 행렬 곱셈 (Java) (0) | 2020.05.28 |
댓글