반응형

이번에 풀 문제는 [백준 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보다는 높을 것 같은데 ㅋㅋ 

반응형

+ Recent posts