백준 17173번 배수 파이썬 풀이
이번에 풀 문제는 [백준 17173번 배수들의 합]입니다.
이제 브론즈2 정도의 문제는 파이썬으로 크게 부담을 느끼지 않고 접근하는데 이번에 의외로 어렵게 느껴져서 다시 한 번 생각해보게 됐던 문제네요.
일단 독해력이 떨어지는 저에게 문제 자체가 어려웠어요.
여러분들은 저와 달리 문제를 잘 이해하셨다는 판단 하에 풀이를 진행하도록 하겠습니다.
코드부터 보여드리도록 하겠습니다.
n, m = map(int, input().split())
sum = 0
cnt = [0]*(n+2)
a = list(map(int, input().split()))
for i in range(1,n+1):
for j in range(0, m):
if i % a[j] == 0:
cnt[i]+=1
if cnt[i]>=2:
sum-=i
sum += i
print(sum)
먼저 첫 줄에 입력되는 두 수를 입력받습니다.
n과 m을 입력 받죠.
n, m = map(int, input().split()) => 여러 수들을 한 번에 입력받는 것이 파이썬은 정말 편한 것 같아요. 처음에는 좀 어려웠는데 C보다 편하네요.
a = list(map(int, input().split()) => 이 부분 굉장히 중요하다고 생각되는 부분인데요. 예를 들어서 C에서는 배열의 크기를 알지 못할 때, malloc이나 calloc을 사용했는데 파이썬에서는 그냥 입력을 받고 리스트로만 바꿔주면 자동으로 배열로 저장된다는 점이 편리하게 생각되었네요. C는 이에 비해서 좀 복잡한 듯..
cnt = [0]*(n+2) => 뒤에 이중 for문에서 n개의 수를 1부터 다 확인해보는데 혹시 몰라서 +2해줬어요. 하도 문자열에서 당한 게 많아서..ㅋㅋㅋ 이 부분을 추가해 준 이유는 뒤에 for문에서 설명드리도록 하겠습니다. 그리고 이 부분에서 정말 인상깊었던 것이 그냥 이렇게 써주기만 하면 [0]으로 크기 n+2만큼으로 초기화 한다는 것이였습니다. 앞으로도 유용하게 쓰일 것 같네요.
1부터 n+1까지의 수가 mk에 의해 나누어지는지 확인하는 for문입니다.
대신 겹치면 안되고 한 번만 세줘야 하는데 이 부분을
if cnt[i]>=2:
sum-=i
이렇게 처리해줬습니다. cnt 배열에 수가 한 번 나왔으면 1을 더해줍니다. 그런데 2가 되게 된다면 한 번 빼줍니다. 뒤에서 다시 더해주기 때문에 +a-a와 같은 형태여서 결국에는 0을 더해주는 셈이죠.
이렇게 풀 수 있습니다.
개인적으로 저는 브론즈2보다는 높을 것 같은데 ㅋㅋ
'프로그래밍 > 파이썬' 카테고리의 다른 글
파이썬 삼항연산자 백준 2609번 (0) | 2020.03.20 |
---|---|
파이썬 2차원 배열 입력받기 백준 2566번 (0) | 2020.03.19 |
파이썬 백준 15947번 아기 석환 (2) | 2020.03.15 |
백준 14624번 파이썬 풀이 (0) | 2020.03.15 |
백준 11718번 파이썬 try except 구문 기초 (0) | 2020.03.14 |