728x90
반응형

그룹 단어 체커 

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.

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>
#include <string.h>
 
int main()
{
    char input[101];
    int N;
    int size;
    int count = 0;
    scanf("%d",&N);
    for(int i=0; i<N; i++){
        int flag=0;
        scanf("%s",input);
        size = strlen(input);
        int distance;
        for(int j=0; j<size; j++){
            for(int k=j+1; k<size; k++){
                if(input[j]==input[k]){
                    distance = k-j;
                    if(distance>=2){
                        if(input[k-1]!=input[k]) flag=1;
                    }
                }
                
            }
            
        }
        
        if(flag==0) count++;
        
        //printf("%d",count);
    }
    printf("%d",count);
    
    
    
    return 0;
}
cs

distance 는 문자열을 순회하는 변수들 사이의 간격을 의미한다

j,k에 대해서 만약 j와 k가 가리키는 문자가 같다면

그 간격을 따져봐야 한다.

간격이 1이면 상관이 없으나

2 이상인 경우 문제가 될 수 있다.

이때 k번째 문자와  k-1 번째 문자를 비교해본다.

만약 같으면 문제가 없다. 간격이 2가 넘는 동안 계속해서 같은 문자가 나왔다는 뜻이니까

하지만 그렇지 않다면 이 문자열은 그룹 단어가 아니다.

 

반응형

'백준 단계별로 풀어보기 > 문자열' 카테고리의 다른 글

백준 2941 크로아티아 알파벳  (1) 2022.10.08
백준 10809 알파벳 찾기  (0) 2022.10.03
백준 5622 다이얼  (1) 2022.10.03
백준 2908 상  (0) 2022.10.03
백준 1152 단어의 개수  (0) 2022.10.03
728x90
반응형

크로아티아 알파벳 

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경
č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

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
 
#include <stdio.h>
#include <string.h>
 
int main()
{
    //char alpha[8] = {'c='','c-'','dz='','d-'','lj','nj','s='','z='};
    
    char input[100];
    scanf("%s",input);
    int size = strlen(input);
    int cnt= 0;
    for(int i=0; i<size; i++){
        if(input[i]=='c'){
            if(input[i+1]=='='||input[i+1]=='-'){
                cnt++;
                i++;
                continue;
            }
        }
        if(input[i]=='d'){
            if(input[i+1]=='-'){
                cnt++;
                i++;
                continue;
            }
            if(input[i+1]=='z'&&input[i+2]=='='){
                cnt++;
                
                i=i+2;
                continue;
            }else{
                cnt++;
                continue;
            }
        }
        if(input[i]=='l'&&input[i+1]=='j'){
            cnt++;
            i++;
            continue;
        }
            
        if(input[i]=='n'&&input[i+1]=='j'){
            cnt++;
            i++;
            continue;
        }
        if(input[i+1]=='='){
            if(input[i]=='s'||input[i]=='z'){
                cnt++;
                i++;
                continue;
            }
        }else{
            cnt++;
        }
    }
    printf("%d",cnt);
    
 
    return 0;
}
 
cs

상당한 노가다를 통해서 만들어 봤다...

다른 풀이들을 보니 총 길이에서 크로아티아 알파벳인 경우 count -- 해주는 식으로

간단하게 구현한것 같다.

 

코드가 복잡해지다 보니 cnt++ , i++를 넣을 곳을 찾는게 어려웠던 것 같다.

 

 

반응형

'백준 단계별로 풀어보기 > 문자열' 카테고리의 다른 글

백준 1316 그룹 단어 체커  (0) 2022.10.08
백준 10809 알파벳 찾기  (0) 2022.10.03
백준 5622 다이얼  (1) 2022.10.03
백준 2908 상  (0) 2022.10.03
백준 1152 단어의 개수  (0) 2022.10.03
728x90
반응형

설탕 배달 

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -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
#include <stdio.h>
 
int main()
{
    int N;
    scanf("%d",&N);
    int a,b;
    int sum=0;
    for(a=0; a<=(N/3); a++){
        for(b=N/5; b>=0; b--){
            if(a*3+b*5==N){
                if(sum==0){
                    sum = a+b;
                    printf("%d",sum);
                    return 0;
                    
                }
            }
            
        }
    }
    if(sum==0){
        printf("-1");
    }
    
    return 0;
}
cs

봉지의 최소 개수만 구하면된다.

최소개수는 5kg 짜리가 많을 때 일 것이다.

3kg 짜리를 a 5kg 짜리를 b 라고 할 때

b는 최대 N/5개 있을 수 있고, a는 최소 0개 부터 있을 수 있으므로

for문을 다음과 같이 작성하였다.

만약 a*3+b*5가 N과 같다면 ,

그리고 최초로 발견된 a,b 쌍이라면 

sum=0일 때 발견되었을 것이므로, 바로 출력한다.

반복문이 끝날때까지 sum 값이 0이라면 조건을 만족하는 a,b쌍이 없던 것이므로

-1을 출력한다.

반응형
728x90
반응형

소수 

 

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -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
 
#include <stdio.h>
 
int main()
{
    int M,N;
    int sum = 0;
    int flag = 0;
    int min = 0;
    scanf("%d\n%d",&M,&N);
    for(int i=M; i<=N; i++){
        flag = 0;
        if(i==1continue;
        for(int j=2; j<i; j++){
            if(i%j==0) flag = 1;
        }
        if(flag==0){
            if(sum==0) min = i;
            sum +=i;
        }
        
    }
    if(sum ==0printf("-1\n");
    else{
        printf("%d\n%d",sum,min);
    }
    
    return 0;
}
 
cs

M이상 N이하의 소수를 찾아야 한다.

1. 소수 찾기

2. 소수들의 합 구하기

3. 소수 중 최소값 구하기

 

 

소수는 for 문을 통해서 찾을 수 있다.

flag 변수를 이용해서 2부터 i 까지 나눠떨어지는 수가 있으면 flag = 1

그렇지 않으면 flag = 0 으로 유지한다. flag 가 0 일때만 i 가 소수이다.

 

flag =0 일때, sum변수에 += i 한다.

소수인 경우에만 더하므로 소수들의 합 역시 구할 수 있다.

 

가장 작은 소수는 M부터 N까지의 순서대로 찾을 때, 

가장 먼저 찾게 되는 소수 일 것이고, 가장 먼저 찾을 때의 sum 값은 0일 것이다.

즉, sum =0 일때 찾은 flag = 0 인 i 값이 가장 작은 소수인 min 값이다.

 

 

반응형

'백준 단계별로 풀어보기 > 기본 수학 2' 카테고리의 다른 글

백준 1978 소수 찾기  (0) 2022.09.19

+ Recent posts