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

 

2559번: 수열

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기

www.acmicpc.net

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h>
#define MAX_ARRY_SIZE 100001
#define MAX(x,y) ( ((x) > (y)) ? (x):(y) )

int main(void) {
	int a, b; // a: 온도 개수,  b: 연속적인 b일
    int i, k; // 반복
	int t; // 온도 
	int sum[MAX_ARRY_SIZE] = { 0, }, max = INT_MIN;

    scanf("%d%d", &a, &b);

	// 누적합: 슬라이딩 윈도우
	for (i = 1; i <= a; i++) {
		scanf("%d", &t);
		sum[i] = sum[i - 1] + t;
	}
	for (i = b; i <= a; i++) {
		max = MAX(max, sum[i] - sum[i - b]);
	}

	printf("%d", max);
    return 0;

}

 

 

예) a = 7 , b = 3

a
b
c
d
e
f
g
sum[0]
0
sum[1]
a
sum[2]
a + b
sum[3]
a + b + c
sum[4]
a + b + c + d
sum[5]
a + b + c + d + e
sum[6]
a + b + c + d + e + f
sum[7]
a + b + c + d + e + f + g

i
sum[i] - sum[i-b]
sum[i] - sum[i-b]
3
sum[3] - sum[0]
a + b + c
4
sum[4] - sum[1]
b + c + d
5
sum[5] - sum[2]
c + d + e
6
sum[6] - sum[3]
d + e + f
7
sum[7] - sum[4]
e + f + g

다른 방법


아래는 시간 초과된 코드

억지로 생각 쥐어짜서 코드 짰음 크크카카커캬커ㅑ커

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h>
#define MAX 100001

int main(void) {
    int a, b, max = INT_MIN; // a: 온도 개수,  b: 연속적인 b일
    int i, k; // 반복
    int t[MAX]; // 온도 저장 배열
    int sum[MAX] = { 0, };

    scanf("%d%d", &a, &b);

    for (i = 0; i < a; i++) {
        scanf("%d", &t[i]);
    }
    // 누적합 배열 만들기
    for (i = 0; i <= a - b; i++) {
        for (k = 0; k < b; k++) {
            sum[i] += t[i + k];
        }
    }

    for (i = 0; i <= a - b; i++)
        if (sum[i] > max) max = sum[i];


    printf("%d", max);
    return 0;

}

 

 

 

'잡동사니 > [2022] 회로이론' 카테고리의 다른 글

[백준/C] 1978번 소수 찾기  (0) 2022.12.11
[백준/C] 9012번 괄호 (스택)  (0) 2022.12.11
[백준/C] 18258번 큐 2  (0) 2022.12.11
[백준/C] 1152번 단어의 개수  (0) 2022.12.11
[백준/C] 2563번 색종이  (0) 2022.12.11

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

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

정적 배열 큐

 

fscanf로 입력받은 후fgetc(stdin)으로 버퍼를 비워주었다

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MALLOC(p,s) {\
    if (!((p) = malloc(s))) {\
    	fprintf(stderr, "Insufficient memory.");\
        exit(EXIT_FAILURE);\
    }\
}
#define MAX_Q_SIZE 2000001
#define MAX(x,y) ((x) > (y)) ? (x):(y) 
int queue[MAX_Q_SIZE];
int front = 0;
int rear = -1;

int main(void) {
    int size;
    int n, data;
    char order[10];

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%s", order);
        fgetc(stdin); // 버퍼 비우기
        
        size = rear - front + 1;
        if (!strcmp(order, "push")) {
            scanf("%d", &data);
            fgetc(stdin); // 버퍼 비우기
            queue[++rear] = data;
            
        }

        else if (!strcmp(order, "pop")) {
            if (size == 0) printf("-1\n");
            else {
                printf("%d\n", queue[front++]);
            }
           
        }

        else if (!strcmp(order, "size")) {
            printf("%d\n", size);
        }

        else if (!strcmp(order, "empty")) {
            if (size == 0) printf("1\n");
            else printf("0\n");
        }

        else if (!strcmp(order, "front")) {
            if (size == 0) printf("-1\n");
            else printf("%d\n", queue[front]);
        }

        else if (!strcmp(order, "back")) {
            if (size == 0) printf("-1\n");
            else printf("%d\n", queue[rear]);
        }
    }
    return 0;

}

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

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

1. 공백의 개수로 단어의 개수를 센다

2. 앞 뒤 공백은 단어 개수로 처리하지 않는다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000001

int main(void) {
    int cnt = 0;
    char str[MAX];
    scanf("%[^\n]", str); // ["%^\n"]은 엔터가 나올때까지 문자열로 받는다는 말이다( 공백도 포함 )
        int len = strlen(str);

    // 공백이 하나일 때 cnt = 0
    if (len == 1 && str[0] == ' ') {
        printf("0");
        return 0;
    }

    for (int i = 1; i < len-1; i++) {
        // 공백의 갯수로 단어의 갯수를 체크하는데
        // 처음과 끝에 공백이 들어오면
        // int를 1 로 지정하고 끝나는 지점은 len - 1 을 해주어 
        // 처음과 끝의 공백은 단어로 카운트하지 않는다.
        if (str[i] == ' ') cnt++;
    }
    printf("%d", cnt+1);
    return 0;

}

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

 

2563번: 색종이

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변

www.acmicpc.net

 

맞은 코드

다른 사람 풀이 보고 풀었다 어려워따

for문 사용을 줄여야겠다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  

int main()
{
    int a[100][100] = {0,}; // 색종이 붙여지지 않은 부분 0으로 초기화
    int i, k, q; // 반복
    int n; // 색종이 개수
    int x, y; // 색종이 왼쪽 아래 점 좌표
    int cnt = 0; // 색종이 넓이 (1이면 색종이 붙여져있음)
    scanf("%d", &n);
    
    for(i=0; i<n; i++){
        scanf("%d %d", &x, &y);
        for(k=x; k<x+10; k++){
            for(q=y; q<y+10; q++){
                if(a[k][q]==1) continue;
                a[k][q] = 1;
                cnt++;
            }
        }
    }
    
    
    printf("%d", cnt);
    return 0;
}

 

 

시간초과 코드

#include <stdio.h>

int main()
{
    int a[100][100] = {0,}; // 색종이 붙여지지 않은 부분 0으로 초기화
    int i, k, q; // 반복
    int n; // 색종이 개수
    int x, y; // 색종이 왼쪽 아래 점 좌표
    int cnt = 0; // 색종이 넓이 (1이면 색종이 붙여져있음)
    scanf("%d", &n);
    
    for(i=0; i<n; i++){
        scanf("%d %d", &x, &y);
        for(k=0; k<10; k++){
            for(q=0; q<10; q++){
                a[x+k][y+q] = 1;
            }
        }
    }
    
    for(i=0; i<100; i++){
        for(k=0; i<100; k++){
            if(a[i][k] == 1) cnt++;
        }
    }
    
    printf("%d", cnt);
    return 0;
}

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

 

11653번: 소인수분해

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

www.acmicpc.net

 

정수를 나누었을 때

나머지가 0이면 그것이 바로 소인수이다

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  

int main()
{
    int n;     // 소인수분해할 양의 정수
    int i, k; // 반복
    
    scanf("%d", &n);
    
    for(i=2; i<=n; i++){
        while(n%i == 0){
            printf("%d\n", i); // 소인수 출력
            n/=i; // 다음 소인수 찾으러 가기 위해
                  // 이전에 찾은 소인수로 나눈다
        }
    }

    return 0;
}

 

 

아래는 문제 잘못 읽어서

약수 구하는 코드이다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  

int main()
{
    int n;     // 소인수분해할 양의 정수
    int i, k; // 반복
    
    scanf("%d", &n);
    
    for(i=2; i<=n; i++){
        if(n%i == 0){
            printf("%d ", i);
        }
    }

    return 0;
}

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

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

 

 

C언어 내장함수 qsort() 퀵 소트 함수를 이용하였다.

퀵소트 구현 아직 못한당. 함수 이용하면 편하다

 

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000001

int compare(const void *a, const void *b) // 비교함수: 뒷 수가 크면 -1, 같으면 0, 앞의 수가 크면 1
{
    int num1 = *(int *)a;
    int num2 = *(int *)b;
 
    if (num1 < num2)
        return -1;
    if (num1 > num2)
        return 1;
    return 0;
}

int main()
{
    int n;          // 정수의 개수
    int num[MAX];   // 입력할 정수
    int i, k;       // 반복
    
    scanf("%d", &n);
    
    for(i=0; i<n; i++){
        scanf("%d", &num[i]);
    }
    
    
    qsort(num, n, sizeof(int), compare); // (정렬할 배열, 요소개수, 요소크기, 비교함수)
    
    for(i=0;i<n; i++){
        printf("%d\n", num[i]);
    }

    return 0;
}

[정리]

DMZ는 외부에 공개하기 위한 네트워크다

외부에 공개하는 서버에는 주로 웹 서버, DNS 서버, 메일 서버가 있다

회사의 서버온프레미스 클라우드로 운영되고 있다

각 서버나 컴퓨터는 스위치무선 랜 기능을 사용하여 사내 랜에 접속한다

 

 

 

소규모 회사(소호 기업)에서의 네트워크 구성

가정에서의 랜 구성과 눈에 띄게 다른 점은

DMZ 라는 네트워크 영역이 있다

 

소호 기업이란?

SOHO (Small Office / Home Office)의 약어이며

소규모 회사를 뜻한다

 

DMZ란?

DeMilitarized Zone의 약어로

외부에 공개하기 위한 네트워크이다.

 

외부에 무엇을 공개하는가?

서버를 공개하는데

주로 웹 서버, 메일 서버, DNS 서버를 공개한다.

 

웹 사이트를 불특정 다수의 외부 사용자에게 공개하려면

웹 서버를 외부에 공개하고

 

외부 사용자와 메일을 주고 받으려면

메일 서버를 외부에 공개하고

 

외부에서 도메인 이름을 사용하여 회사의 서버에 접속하려면

DNS 서버를 외부에 공개한다

 

 

회사에서 구성하는 랜에는 다양한 서버가 사용되고 있다

일반적인 가정의 네트워크에서는 서버를 외부에 공개할 필요가 없기 때문에 공개하지 않는다

직원수가 많을 수록 스위치와 같은 장비가 늘고 랜 케이블의 배선이 늘어난다

 

회사에서는 서버를 운영하기 위해서

서버를 사내에 설치하거나

서버를 데이터센터에 두거나

서버를 클라우드에 둘 수 있다

 

데이터 센터란?

대량의 데이터를 보관하기 위해

데이터 센터 서버네트워크 기기를 설치한 전용시설

 

클라우드란?

인터넷을 통해 소프트웨어나 하드웨어 등의 컴퓨팅 서비스를 제공하는 것으로

인터넷에 접속하기만 한다면 언제 어디서든 이용할 수 있다

 

 

사내에서 서버를 운영하는 경우에는

회사 내에 서버 장비실을 두고 

그 곳에 랙 (선반)을 설치한다

랙 안에 서버를 두고 관리한다

 

온프레미스란?

on-premise, 사내 또는 데이터 센터에 서버를 두고 운영하는 것

클라우드와 비교할 때 자주 사용하는 용어이다

 

랙 안에는 랙에 설치하기 적합한 형태와 크기를 가진

서버라우터스위치를 설치할 수 있는데

라우터는 무선 랜 기능이 있는 라우터를 사용하는 경우가 많다

 

각 서버는 스위치와 연결하여 서로 통신할 수 있다

사무실 안에서 사용하는 컴퓨터와 프린터도

근처에 있는 스위치에 연결하거나

무선 랜 기능을 통해 랜에 연결해야

네트워크를 사용할 수 있다

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

 

11050번: 이항 계수 1

첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\))

www.acmicpc.net

 

 

팩토리얼 함수를 구현하여 표현하였다.

코드 효율은 낮을 수도..

 

맞은 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int factorial(int n) {
	int num = 1;

	if (n == 0) return 1;

	for (int i = 2; i <= n; i++) {
		num = num * i;
	}
	return num;
}

int main() {

	int N, K;
	scanf("%d %d", &N, &K);

	int a = factorial(N);
	int b = factorial(K);
	int c = factorial(N - K);

	printf("%d", a / (b*c));

	return 0;
}

+ Recent posts