본문 바로가기
Algorithm/baekjoon

[백준] 3052번 나머지 파이썬 (python)

by eoieiie 2024. 3. 11.

문제 

두 자연수 A와 B가 있을 때, A% B는 A를 B로 나눈 나머지이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

 

정답코드

arr = []

for i in range(10):
    a = int(input())
    if a%42 not in arr:
        arr.append(a % 42)
        
print(len(arr))

 

풀이

  1. 리스트를 선언한다. 
  2. 10번을 돌리면서 입력 a를 받는데, 
  3. 만약 입력받은 a값을 42로 나눈 나머지가 arr안에 없을 시
  4. a을 42로 나눈 나머지들을 arr안에 저장한다.
  5. 그리고 arr안에 저장된 요소들의 개수를 센다. 
  6. 사실 중복제거는 .set() 으로도 가능하다.

 

느낀 점

일단 내가 처음에 풀었던 코드는 다음과 같다. 풀고 나서 되게 좋아했었는데, 간략한 정답코드를 보니 아직 갈 길이 한참 멀었다는 게 새삼 느껴진다. 

lista = []
listb = []
cnt = 0

for i in range(10):
    a = int(input())
    lista.append(a)

for n in range(len(lista)):
    b = lista[n] % 42
    lista[n] = b

for i in range(0, 43):
    if i in lista:
        if i not in listb:
            listb.append(i)
            cnt += 1

print(cnt)

 

  1. 먼저 리스트 2개를 선언해주고, 리스트 요소의 개수를 셀 변수 cnt를 지정해 줬다. 
  2. lista 안에 10번 반복하여 차례대로 입력을 받는다. 
  3. lista 의 요소를 차례대로 42로 나누어 lista에 다시 집어넣는다. 
  4. 42로 나눈 나머지들이 뭐가 있을까 생각해 보니 0부터 41까지의 값을 가진다는 것을 깨달았고, 
  5. 그 값들 중 필요한 것들을 다음과 같은 조건문으로 걸러냈다:
  6. 해당 값이 lista안에 존재할 것
  7. 만약 존재한다면 listb안에는 중복으로 존재하지 않을 것
  8. 위 조건에 만족한다면
  9. 해당 값을 listb에 집어넣고(추후 일어날 중복방지용)
  10. cnt값을 1증가시킬 것. 

 

댓글