본문 바로가기
🥇Problem Solving (psS2mj)/BOJ

[BOJ] 3052. 나머지 (Python3)

by psS2mj 2020. 9. 4.
반응형

문제 링크 / level: Bronze II

www.acmicpc.net/problem/3052

 

3052번: 나머지

39, 40, 41, 42, 43, 44, 82, 83, 84, 85를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 모두 6개가 있다.

www.acmicpc.net


배열에 관한 문제인데, 여러 가지를 연습해볼 수 있을 것 같아서 도전해봤다.

오늘도 가즈아!!!

문제를 풀어본 결과 몇 가지 공부포인트가 있었다.

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 값을 쌍으로 가지는 자료형이다. 잘 알아두도록 하자.

 

참고링크

그리하여

가볍게 문제를 맞힐 수 있었다.

 

💙전체코드💛

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가지 코드 중에 가장 느렸다. 그래도 길이는 가장 짧았다^_^

덕분에 새로운 입력방법을 알았으니 아무튼 하나 얻어갑니다.😏✌

 

 

- 뿌듯하게 마무으리🌷 -

반응형

댓글