제가 아는 소스코드 올리는 2가지 방법을 공유하고자 합니다.

간단하지만 분명 방법을 모르는 분들이 많을 것 같습니다.(저처럼....)


1.  줄번호X, 색깔통일된 블럭 형식의 소스코드


소스코드를 올리고 싶은 부분에

상단 배너의 "외부컨텐츠" -> "html"체크 -> 아래와 같은 코드 작성 후(c++기준, 다른 언어는 "cpp"부분을 수정하셔야합니다.)


 <pre name="code" class="cpp"



</pre>


확인을 누르면 블럭한개가 생깁니다.  그 블럭에 소스코드를 붙여넣기하면 블럭안에 소스코드가 들어가는데,

미리보기로 확인해보시면 다음과 같이 나오게됩니다.

#include<iostream>
using namespace std;
int main()
{
	//헬로월드 출력하기
	cout << "hello world" << endl;
	return 0;
}


2. 줄번호O, 색깔 분리되고 가독성좋은 소스코드

실제 비쥬얼스튜디오의 코드를 그대로 옮겨놓은 듯한 느낌을 주고, 실제로 제가 현재사용하는 방법입니다.


일단 코드를 HTML코드로 생성해주는 사이트를 이용해야합니다.

https://colorscripter.com/을 클릭 한 뒤, 소스코드를 거기에 붙여넣기합니다. 

배경, 스타일패키지 등은 원하는대로 상단배너에서 조절가능합니다.

소스코드를 붙여넣기 한 후 , 하단의 "HTML로 복사"를 클릭하면 HTML코드로 변환된 본인의 소스코드가 나오게됩니다.

그 코드를 통째로 복사해 놓습니다. 그리고 다시 본인이 글 쓰고있는 블로그화면으로 돌아옵니다.


사진, 슬라이드쇼, 동영상, 파일 등이 적힌 상단배너의 맨 오른쪽 HTML에 체크를 하면 HTML코드들이 나옵니다.

본인이 코드를 게시하고싶은 부분에 복사해두었던 HTML코드를 붙여넣기합니다. (굉장히 깁니다.)

붙여넣기할 부분에 이상한 코드, 예를들어 (<p><br/></p>) 같은 코드들은 지우고 그 자리에 붙여넣기 하면됩니다.

붙여넣기를 완료하고 다시 상단 배너의 HTML을 체크하면 아래와 같이 소스코드가 나옵니다. 

1
2
3
4
5
6
7
8
#include<iostream>
using namespace std;
int main()
{
    //헬로월드 출력하기
    cout << "hello world" << endl;
    return 0;
}
cs


문제 

10*10 2차원 배열에서 

YELLOW: 2, BLACK: 1, WHITE: 0 으로 설정하여 다음과 같이 칠해진 좌표가 있다고하자.

X표 되어있는 좌표는 0인 상태이고, (4,4)좌표부터 시작해서 순환함수를 이용하여 모든 0인 좌표를 1로 칠하자.


풀이

반복문으로 작성하면 금방이지만 순환함수를 사용하라고했으므로, 좌표의 색깔을 입히는 함수내부에 

시작 좌표부터 각 방향(동서남북)으로 탐색을 시작하여 모든 0인좌표들을찾아서 1로 바꾸는 순환함수를 작성한다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#define WHITE 0 // 0을 WHITE라 정의
#define BLACK 1 // 1을 BLACK이라 정의
#define YELLOW 2 // 2를 YELLOW라 정의
 
int screen[10][10= // 배열 초기화 후 바로 초기값을 넣어줍니다.
{ {2,2,2,2,2,2,2,2,2,2},
 {2,2,2,2,2,2,2,2,2,2},
 {2,2,2,0,0,0,0,2,2,2},
 {2,2,2,2,0,0,0,2,2,2},
 {2,2,2,2,0,0,0,2,2,2},
 {2,2,2,2,0,0,0,0,2,2},
 {2,2,2,2,0,2,2,2,2,2},
 {2,2,2,2,0,2,2,2,2,2},
 {2,2,2,2,0,2,2,2,2,2},
 {2,2,2,2,2,2,2,2,2,2} };
 
// screen 배열을 읽어들이기(순환 호출에서 쓰임)
char read_pixel(int x, int y)
{
    return screen[x][y];
}
 
// 해당 x, y 위치를 color(BLACK)로 채우기(순환 호출에서 쓰임)
void write_pixel(int x, int y, int color)
{
    screen[x][y] = color;
}
 
 //영역 채우기 알고리즘 
void flood_fill(int x, int y)
{
    if (read_pixel(x, y) == WHITE) // read_pixel 함수 호출의 결과로 0을 발견하면
    {
        write_pixel(x, y, BLACK); // write_pixel 함수를 호출해서 BLACK(1)로 채우기
        //동
        if (x + 1 < 10)
            flood_fill(x + 1, y);
        //남
        if (y + 1 < 10)
            flood_fill(x, y + 1);
        //서
        if (x - 1 >= 0)
            flood_fill(x - 1, y);
        //북
        if (y - 1 >= 0)
            flood_fill(x, y - 1); 
    }
}
 
void result_print()
{
    int i, j; // 인덱스 i, j 선언
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            printf("%d ", screen[i][j]); // 10x10 크기의 배열 출력(보여주기)
        }
        printf("\n");
    }
}
 
int main()
{
 
    printf("영역 채우기 대상 도형\n-------------------\n");
    result_print(); // 초기값으로 지정된 배열을 출력 
 
    flood_fill(44); // 채우기 실행(시작 위치: 4,4)
 
    printf("안쪽을 채우는 순환 호출 함수 작동\n-------------------\n");
    result_print(); // flood_fill 함수 호출 뒤 결과(배열) 출력 
 
    return 0;
}
cs


결과



문제

1부터 100만까지 순차적으로 더하는 연산의 수행시간과 다른 덧셈 알고리즘을 이용한 연산의 수행시간을 구하시오


풀이

1부터 100만까지 더하는 반복문을 그대로 작성하고, 저는 n(n+1)/2의 합공식을 이용한 알고리즘으로 풀었습니다. 

 

코드 및 결과


알고리즘1(순차 덧셈)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    clock_t start, end;
    double duration;
    long long sum = 0;
    start = clock();
    for (int i = 1; i <= 1000000; i++)
        sum += i;
    end = clock();
    duration = (double)(end - start) / CLOCKS_PER_SEC;
    printf("수행시간은%f초입니다.\n", duration);
    printf("총합은%lld입니다.\n", sum);
}
cs



알고리즘2(합공식)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
long long func(long long n);
int main()
{
    clock_t start, end;
    double duration;
    long long sum = 0;
    start = clock();
    sum = func(1000000);
    end = clock();
    duration = (double)(end - start) / CLOCKS_PER_SEC;
    printf("수행시간은%f초입니다.\n", duration);
    printf("총합은%lld입니다.\n", sum);
}
long long func(long long n)
{
    return n * (n + 1/ 2;
}
cs




문제출처: https://www.acmicpc.net/problem/17206


풀이

그냥 단순히 3또는 7의 배수인 수를 구해서 정답을 구하면 100%시간초과가 뜹니다.

테스트케이스가 최대 10만번인데 입력범위가 최대 8만 까지이므로

T가 10만이고 모든 테스트케이스의 N이 8만인 최악의 경우 최대 80억번 연산을 해야합니다.

따라서 저는 연산 전 미리 10만까지의 수에 대해 배열에 그 값까지의 합을 구해놓고 풀었습니다.

예를들어 N이 49면 temp[49]는 3부터 49까지의 수 중 3또는 7의 배수일 때 그 수들의 합을 미리 저장해서 답만 출력시키게끔 했습니다.

이렇게 하면 최대 연산횟수를 80억번에서 18만번으로 떡락시킬 수 있습니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
#include<algorithm>
using namespace std;
int arr[100001];
int main()
{
    cin.tie(0);
    cin.sync_with_stdio(false);
    int t, temp=0, sum = 0;
    for (int i = 3; i <= 80000; i++)
    {
        if (i % 3 == 0 && i % 7 == 0)
        {
            temp += i;
        }
        else if (i % 3 == 0)
        {
            temp += i;
 
        }
        else if (i % 7 == 0)
            temp += i;
        arr[i] = temp;
    }
    cin >> t;
    for (int i = 0; i < t; i++)
    {
        cin >> temp;
        cout << arr[temp] << '\n';
    }
 
}
cs


결과



'문제풀이(BOJ) > 수학' 카테고리의 다른 글

[백준 2981] 검문  (0) 2020.08.27
[백준 13301] 타일 장식물  (0) 2020.03.11
[백준 11051] 이항 계수 2  (0) 2020.02.10
[백준 1339] 단어 수학  (0) 2020.02.09
[백준 11444] 피보나치 수6  (0) 2020.01.19

문제출처: https://www.acmicpc.net/problem/13300


풀이

2개의성별, 6개의 학년이 있기 때문에 총 12가지의 경우가 생깁니다. 2차원 배열이 바로 떠올랐고 이를 이용해 간단하게 풀 수 있었습니다.

필요한 방의 갯수는 성별/학년 별로 학생의 수가 저장된 배열값에서 k로 나눈 몫+나머지 입니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
int stu[2][6];
int main()
{
    int n, k, s, y, cnt = 0;
    cin >> n >> k;
    for (int i = 0; i < n; i++)
    {
        cin >> s >> y;
        stu[s][y - 1]++;
    }
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            //나눈 몫= 방의개수
            cnt += stu[i][j] / k;
            //나머지있을시 방의개수+1
            if (stu[i][j] % k != 0)
                cnt++;
        }
    }
    cout << cnt << endl;
}
cs


결과












문제출처: https://www.acmicpc.net/problem/13301


풀이

피보나치 수열+ 규칙찾기 문제입니다.

시작인덱스를 0으로 잡으면 N번째 수는 arr[n-1]이고, 이 것을 이용해 둘레를 구해보면

n번째 수*2+ (n번째 수+n-1번째 수)*2가 됩니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
long long arr[81];
 
int main()
{
    arr[0= 1;
    arr[1= 1;
    for (int i = 2; i < 80; i++)
        arr[i] = arr[i - 1+ arr[i - 2];
    int n;
    cin >> n;
    cout << arr[n - 1* 2 + (arr[n - 1+ arr[n-2]) * 2 << endl;
 
}
cs


결과


'문제풀이(BOJ) > 수학' 카테고리의 다른 글

[백준 2981] 검문  (0) 2020.08.27
[백준 17206] 준석이의 수학 숙제  (0) 2020.03.11
[백준 11051] 이항 계수 2  (0) 2020.02.10
[백준 1339] 단어 수학  (0) 2020.02.09
[백준 11444] 피보나치 수6  (0) 2020.01.19

문제출처: https://www.acmicpc.net/problem/14647


풀이

빙고판에서 9의 총 갯수에서 9가 가장많이 나오는 행과 열  중 9가 더 많이등장한 행or열의 값을 뺀 값이 정답입니다.

값은 행/열 배열값을 의미하고, 각각의 행or열에서 등장하는 9의 갯수가 담겨져있습니다.

이것을 그대로 소스코드로 구현하면 됩니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
using namespace std;
int max_val;
int arr[500][500];
int row[500], col[500];
int sum;
int func(int num);
int main()
{
    cin.tie(0);
    cin.sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> arr[i][j];
            row[i] += func(arr[i][j]);
            col[j] += func(arr[i][j]);
            sum += func(arr[i][j]);
        }
    }
    //행에대해서 탐색 
    for (int i = 0; i < n; i++)
    {
        if (row[i] > max_val)max_val = row[i];
    }
    //열에대해서 탐색
    for (int j = 0; j < m; j++)
    {
        if (col[j] > max_val)max_val = col[j];
    }
    //전체 9의 갯수 값에서 행,열중 큰 값을 뺀값이 정답
    cout << sum - max_val <<endl;
}
int func(int num)
{
    int cnt = 0;
    while (num)
    {
        if (num % 10== 9)cnt++;
        num /= 10;
    }
    return cnt;
}
cs


결과


문제출처: https://www.acmicpc.net/problem/16395


풀이

파스칼의 삼각형같은 이항계수의 성질을 이용하는 문제는 dp로 접근하는게 제일 쉬운 것 같습니다.

각 행의 맨 왼쪽 값을 1로 고정시켜놓고 n+1Cr+1=nCr+nCr+1 의 성질을 이용하여 dp식을 세웠습니다.

*각 행의 맨 오른쪽 값1은 최초의 값 1설정 후 dp계산시 저절로 1로 고정된 상태가 됩니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, k;
int dp[31][31];
int main()
{
    cin >> n >> k;
    for (int i = 0; i < 31; i++)
    {
        dp[i][0= 1;
    }
    for (int i = 1; i < 31; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            dp[i][j] = dp[i - 1][j - 1+ dp[i - 1][j];
        }
    }
    cout << dp[n-1][k-1<< endl;
    
}
cs


결과


+ Recent posts