백준 3052 나머지

https://www.acmicpc.net/problem/3052

#include <stdio.h>
int main(void){
    int nums=0, rest[42]={0, }, sum=0, i;
    for(int c=0; c<10; c++){
        scanf("%d",&nums);
        for(i=0; i<42; i++){
            if(nums%42==i){
                rest[i]++;
                break;
            }
        }
    }
    for(i=0; i<42; i++){
        if(rest[i]>=1){
            rest[i]=1;
            sum++;
        }
    }
    printf("%d",sum);
    return 0;
}

나머지로 나온 서로 다른 값들을 배열에 담은 후 출력하는 부분에서 시간이 많이 걸렸다. 너무 어렵게 생각하다가 제일 간단한 방법으로 답을 냈는데, 코드가 너무 멋대가리가 없어서 다른 사람 코드를 찾아보았다.

int main()
{
	int a, r[42]={0}, i, c=0;
	for (i=0; i<10; i++) {
		scanf("%d", &a);
		r[a%42]++;
	}
	for (i=0; i<42; i++)
		if (r[i])
			c++;
	printf("%d", c);
}

r[a%42]++; 부분이 굉장히 인상깊었다.
나는
for(i=0; i<42; i++){
if(nums%42==i){
rest[i]++;
break;
}
이렇게 짰는데 이걸 한방에 줄여버릴 방법은 생각치도 못했다. 굳이 반복문 한번 더 안써도 되고, 간단하고 직관적이다.

그리고 if (r[i])부분은 괄호안이 0만 아니면 충족하는 조건이기 때문에 나처럼 배열의 값을 1로 바꾸고 할 필요가 없었다.

요령을 정리하자면,
1. 배열에 연산식을 넣어도 된다.
2. 조건문에 비교문 대신에 0과 0이외의 값으로 참 거짓을 판별하는 방법도 좋다.


(참고 : https://www.acmicpc.net/source/16673187)

좋은 웹페이지 즐겨찾기