풀이

 

이 문제는 재귀함수 연습용으로!

 

소스 코드

 

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 <stdio.h>
 
void draw(int f, int k, int n) {
    if (f == n) return;
    else {
        if (f < k) printf(" ");
        else printf("*");
        draw(f + 1,k, n);
    }
}
void star(int k, int n) {
    if (k == n) return;
    else {
        draw(0, k, n);
        printf("\n");
        star(k + 1, n);
    }
}
 
int main() {
    int n;
    scanf("%d",&n);
    star(0,n);
    return 0;
}
cs

 

풀이

 

STL이라는 c++의 알고리즘을 사용하면 쉽게 풀립니다. 이건 문제가 어렵다기 보다는 얼마나 빨리 정렬하고 k번째(C언어는 0부터 시작하므로 k-1번째) 수를 찾느냐가 관건이고, 정렬 코드를 직접 쓰면 시간이 오래 걸리고 정확하지도 않고 느리기 때문에 STL의 sort()함수를 사용합니다.

 

소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> v;
int main() {
    int n, k, su;
    scanf("%d %d",&n,&k);
    for (int i = 0; i < n; i++scanf("%d",&su), v.push_back(su);
    sort(v.begin(), v.end());
    printf("%d",v[k-1]);
    return 0;
}
cs

 

풀이

 

처음 터진 대형 불꽃 1개 + 나눠진 k개 + k개에서 또 나눠진 k개(k*k개), 이것만 안다면 1+k+k*k = sum이라는 방정식을 세워 문제를 구할 수 있습니다.

 

소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
    int n,k=0,sum = 0;
    scanf("%d",&n);
    while (sum != n) {
        k++;
        sum = 1 + k + k * k;
    }
    printf("%d",k);
    return 0;
}
cs

 

풀이

 

다 더한 후에 2개씩 빼줍니다! 그럼 답이 보여요

 

소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int arr[9];
int main() {
    int i = 0, sum = 0,j,k;
    while (i < 9scanf("%d"&arr[i]), sum += arr[i++];
    for (i = 0; i < 9; i++) {
        for (j = 0; j < 9; j++) {
            if (i != j && sum - arr[i] - arr[j] == 100) {
                for (k = 0; k < 9; k++if (k != i && k != j) printf("%d\n",arr[k]);
            }
        }
    }
    return 0;
}
cs

 

풀이

 

돈 배열을 만들고 뺄 때마다 수를 세서 출력하면 됩니다.

 

소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int arr[6= { 500100501051 };
int main() {
    int n, k, c=0,i=0;
    scanf("%d",&n);
    k = 1000 - n;
    while (k != 0) {
        if (k >= arr[i]) {
            k -= arr[i];
            c++;
        }
        else i++;
    }
    printf("%d",c);
    return 0;
}
cs

풀이

 

문제 센스에 웃고 갑니다ㅋㅋ 기승전 비와이로 풀면 되는 문제입니다.

 

소스 코드

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main() {
    int n, k,i,a,b;
    scanf("%d %d",&n,&k);
    for (i = 0; i < n; i++) {
        scanf("%d %d",&a,&b);
    }
    printf("비와이");
    return 0;
}
cs

 

 

풀이

 

이 문제는 실수를 처리하는데 있어서 double을 사용해야만 풀립니다. 방향고려해서 반복문을 돌리는데 '비서들이 동시에 올라오면 여러 번 밟은 것으로 간주'되기 때문에 중복 방지를 해 줄 필요가 없어 그냥 비서마다 각각 돌을 밟은 횟수를 세서 3으로 나눠 0은 파랑색, 1은 빨간색, 2는 초록색 으로 처리 후 각각 돈 * 비율로 계산하면 문제가 해결됩니다.

 

소스코드

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 <stdio.h>
 
int main() {
    int n,i,j,w;
    double p;
    char c;
    int c1=0, c2=0, c3=0;
    int arr[100= {0};
    scanf("%lf %d",&p,&n);
    while (n--) {
        scanf("%d %c",&w,&c);
        if (c == 'R') {
            for (i = w; i < 100; i++) {
                arr[i]++;
            }
        }
        else {
            for (i = w - 2; i >= 0; i--) {
                arr[i]++;
            }
        }
    }
    for (i = 0; i < 100; i++) {
        switch (arr[i] % 3) {
        case 0: c1++break;
        case 1: c2++break;
        case 2: c3++break;
        }
    }
    printf("%.2lf\n%.2lf\n%.2lf\n",p/100*c1, p / 100 * c2, p / 100 * c3);
    return 0;
}
cs

 

풀이

 

쿼리란 미리 명령(형식)을 정해놓고 q번 동안 미리 정해 놓은 명령들을 수행하고 결과를 각각 출력하는 것입니다. 문제는 단순하나 여기서 실수가 날 수 있는 부분은 입력받은 a, b, c, d는 모두 정수형(int) 범위이지만 정수들의 합(sum)은 long long 범위라는 것입니다. 예를 들어 a번째 숫자부터 b번째 숫자 사이에(양끝 포함, [a,b]) 정수들이 모두 int 자료형에 최댓값이었다면 그 합은 int형 범위를 넘게 됩니다. 이 부분만 주의하여 풀었다면 쉽게 정답을 도출할 수 있습니다.

 

소스코드

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
#include <stdio.h>
 
int main() {
    int n, q, i, j,count,a,b,c,d;
    long long sum = 0;
    int arr[1000];
    scanf("%d %d",&n,&q);
    for (i = 0; i < n; i++) {
        scanf("%d",&arr[i]);
    }
    while (q--) {
        scanf("%d"&count);
        if (count == 1) {
            scanf("%d %d",&a,&b);
            for (i = a - 1; i < b; i++) {
                sum += arr[i];
            }
            printf("%lld\n",sum);
            int tmp = arr[a - 1];
            arr[a - 1= arr[b - 1];
            arr[b - 1= tmp;
        }
        else if (count == 2){
            scanf("%d %d %d %d",&a,&b,&c,&d);
            for (i = a - 1; i < b; i++) {
                sum += arr[i];
            }
            for (i = c - 1; i < d; i++) {
                sum -= arr[i];
            }
            printf("%lld\n",sum);
        }
        sum = 0;
    }
    return 0;
}
cs

 

풀이

 

이 문제는 하나하나 항을 지워주는 작업을 하지 않는 게 핵심입니다. 전형적인 시간초과 유도문제죠. 이러한 실수만 하지 않는다면 엄청 간단하게 풀 수 있는 문제입니다. 해싱기법을 통해 배열에 값을 저장하는 것이 아닌 입력한 값을 배열에 인덱스로 해서 몇 번 불렸는지를 배열요소로 가지게 배열을 설정합니다. 그리고 문제는 최댓값은 각 순간순간임을 생각하고 문제를 풉니다.

 

 

소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main() {
    int n,i,su,max=0,num=0;
    int arr[100000= {0};
    scanf("%d",&n);
    for (i = 0; i < n * 2; i++) {
        scanf("%d",&su);
        if (arr[su-1== 0)
            num++;
        else if (arr[su-1== 1)
            num--;
        arr[su-1]++;
        if (max < num) max = num;
    }
    printf("%d",max);
    return 0;
}
cs

'Baekjoon online judge 문제 풀이' 카테고리의 다른 글

[BOJ 14649번] 문홍안  (0) 2018.05.01
[BOJ 14648번] 쿼리 맛보기  (0) 2018.05.01
[BOJ 14647번] 준오는 조류혐오야!!  (0) 2018.05.01
[BOJ 9012번] 괄호  (0) 2018.03.29
[BOJ 10828번] 스택  (0) 2018.02.22

풀이

 

이 문제를 빨리 푸냐 늦게 푸냐를 결정하는 것은 준오가 9가 가장 많이 나온 행 또는 열을 지운다는 것을 진짜 행이나 열을 지우는 것으로 생각하면 안 된다는 것입니다. 이를 해결할 수 있는 가장 기본적인 아이디어는 9가 나온 횟수를 모두 세서 9가 최대 많이 나온 행 또는 열의 9의 개수를 빼준다는 것입니다. 9의 횟수를 셀 때, 행과 열을 나눠서 생각할 수 있는데 행변화 열고정, 행고정 열변화 이렇게 경우를 2개로 나눈다면 나머지는 9의 숫자를 세기만 하면 됩니다. x % 10 연산을 수행하여 10으로 나눈 나머지가 9인지를 비교(가장 오른쪽에 숫자를 반환)하고 계속 10으로 나눠줌으로써 9의 숫자를 셀 수 있습니다. 각 행 또는 열의 최댓값을 세서 마지막에 전체 9가 나온 횟수 - 9가 가장 많이 나온 행 또는 열의 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
#include <stdio.h>
 
int main() {
    int n, m, i = 0, j = 0, max = 0, su = 0, sum = 0, num = 0;//i,j는 열과 행, 행과 열을 나타내고, max는 가장 많이 나온 행, sum은 9가 나온 횟수 전부, num은 임시변수
    int arr[500][500];
    scanf("%d %d"&n, &m);
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            scanf("%d"&arr[i][j]);
        }
    }
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            num = arr[j][i];
            while (num != 0) {
                if (num % 10 == 9) su++;
                num /= 10;
            }
        }
        if (max < su) max = su;
        su = 0;
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            num = arr[i][j];
            while (num != 0) {
                if (num % 10 == 9)
                    su++;
                num /= 10;
            }
        }
        sum += su;
        if (max < su) max = su;
        su = 0;
    }
    printf("%d",sum - max);
    return 0;
}
cs

'Baekjoon online judge 문제 풀이' 카테고리의 다른 글

[BOJ 14648번] 쿼리 맛보기  (0) 2018.05.01
[BOJ 14646번] 욱제는 결정장애야!!  (0) 2018.05.01
[BOJ 9012번] 괄호  (0) 2018.03.29
[BOJ 10828번] 스택  (0) 2018.02.22
[BOJ 11727번] 2*n 타일링2  (0) 2018.02.22

+ Recent posts