💻STUDY/BOJ

[BOJ] 3052. 나머지 (C,Python3)

coldNoodlePigeon 2022. 1. 15.
  • 코딩 초보. 구현을 목표로 해서 코드가 비효율적일 수 있습니다.  

 

3052. 나머지

 

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

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

 

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다. 


1.C99

 

#include <stdio.h>

main() {
	int a[10];
	int b[42]; 
	int result=0; 

	for (int i = 0; i < 10; i++) {
		scanf("%d", &a[i]);
		a[i] = a[i] % 42; 
	}
	
	for (int i = 0; i < 42; i++) {
		b[i] = 0; 
	}
	
	for (int i = 0; i < 10; i++) {
		int k = a[i];
		if (b[k] == 0) {
			result++;
			b[k] = 1; 
		}
	}
	printf("%d", result);
	
}

처음에 생각해낸 방법은 scanf()를 통해 각각 값들을 입력받아 42로 나눈 나머지를 a라는 배열에 저장한 후, b라는 배열에 그 값들을 저장한다. (단, 이미 b 배열에 저장된 경우에는 저장하지 않도록. 그래야 서로 다른 수를 셀 수 있으니까) 그리고 b 배열의 길이를 구하는 방법을 하려고 했는데... 무슨 이유에선지 이러면 반례가 생겨버린다. 그래서 다른 방식으로 구현하고자 했다. 

 

42라는 수로 나누면 나머지는 0~41이므로 배열크기가 42인 int형 배열 b를 만들어서 해당하는 나머지 (인덱스)가 있으면 1로 만들어주고 그와 동시에 result 값을 증가시키도록 했다. (중복되는 값이 동시에 카운트되지 않도록 b 배열에 0이 있을때에만 result를 증가시키도록 한다. ) 

 


2.Python 

 

lst=[]
chk=[]
result=0

for i in range(10):
    k=int(input())
    lst.append(k%42)
for j in range(42):
    chk.append(0)
for i in range(10):
    k=lst[i]
    if(chk[k]==0):
        result+=1
        chk[k]=1
print(result)

 

같은 방식으로 구현했다. 

 

 

 

 

댓글