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

 

24524번: 아름다운 문자열

첫째 줄과 둘째 줄에 영어 알파벳 소문자로만 이루어진 문자열 $S$와 $T$가 각각 주어진다. ($1\leq \left|S \right|\leq 10^6$, $1\leq \left|T \right|\leq 26$, $\left|T \right|\leq \left|S \right|$, $\left|S \right|$와 $\left|T \

www.acmicpc.net

 

문제 자체는 어렵지 않았는데 시간제한이 너무 빡빡했습니다.

몰랐는데 strlen 함수가 시간을 엄청나게 잡아먹더라고요. 변수에다가 strlen 값을 미리 저장시켜두고 써먹어야겠습니다.

이거 때문에 2~30분은 버렸네요.

 

 

제가 푼 문제 풀이 로직은 이렇습니다.

 

먼저 알파벳의 개수를 세어줄 answer 배열을 준비합니다.

 

1. S를 앞에서부터 읽어나가며 T에 동일한 문자가 있는지 찾습니다.

2. T[0]과 동일하다면 answer[T[0]]++,  첫 번째 이후의 문자와 동일하다면 answer[T[j - 1]]의 값과 비교해서 answer[T[j]] 가 더 작다면 answer[T[j]]++.

 

answer[T의 마지막 알파벳] 이 정답입니다.

 

ex) waawa wa 의 경우 위의 연산을 마치면 w 2개 a 2개로 정답은 2가 됩니다.

      aaassss sa 의 경우 위의 연산을 마치면 s 4개 a 0개로 정답은 0이 됩니다.

 

밑에 반례와 코드입니다.

waaaawawawawwwaaaaaawwawawwawawwaaaawa
aw

15


tasdfjasdfletllelteeelteletelteeelteltleltelltelltelellelelelllteltleltlqwereltlqwerleqwerlellelqwereeeteqwerlqwerltltelasdfkasdfeowijqjofiajsdnfvznxnnftlelteltleltellteltle
tle

23


jiwon
jiwon

1


goodgooddogbaaaaagood
god

3
#include <stdio.h>
#include <string.h>

int main() {
    char s[1000011] = {}, t[26] = {};
    int answer[150] = {};
    scanf("%s %s", s, t);
    int a = strlen(s), b = strlen(t);
    for(int i = 0; i < a; i++) {
        for(int j = 0; j< b; j++) {
            if(s[i] == t[0]) {
                answer[t[0]]++;
                break;
            }
            else if(s[i] == t[j] && answer[t[j]] < answer[t[j - 1]]) {
                answer[t[j]]++;
                break;
            }
        }
    }
    printf("%d", answer[t[b - 1]]);
}

 

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

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

블로그에 들어오시는 분들이 쉬운 문제를 보러 오시는 분들이 대부분이라 단계별 풀기 밀어낼겸 쉬운 문제로 가져왔습니다.

 

입력

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

 

 

해결 방법

 

배열에 학생들 점수를 받아준 다음, 평균이 넘는 사람의 숫자를 세서

(평균을 넘는 사람) / (N명) * 100 을 출력해주면 몇 퍼센트인지 구할 수 있습니다.

 

주의할 점:

1. 평균을 넘는 사람을 담는 변수인 over를 초기화 시켜주기. 

2. % 출력

3. 소수점 3자리 까지만 출력

 

 

#include <stdio.h>
int main() {
    double C, n;
    double arr[1000] = {}; //최소 1~ 최대 1000명이니, 1000칸만 있으면 됩니다.
    scanf("%lf", &C);
    for(int i = 0; i < C; i++) { //C번만큼 반복
        double sum = 0; //총 합계
        scanf("%lf", &n);

        for(int j = 0; j < n; j++) {
            scanf("%lf", &arr[j]);
            sum += arr[j]; //배열에 입력해주며 총 합계를 구해줍니다.
        }
        
        double average = sum / n; // 평균 = (총합) / (명 수)
        double over = 0;//평균을 넘는 사람을 세줄 변수 선언
        for(int j = 0; j < n; j++) {
            if(arr[j] > average) { //배열에 담긴 점수가 평균을 넘으면
                over++; //over에 +1
            }
        }
        printf("%.3lf%%\n", (over/ n) * 100);
    }
}

9문제(A B C D E F G I J) 맞췄습니다.

잘하시는 분들에겐 그냥 웃긴 수준일테지만, 그래도 제가 참여한 모든 대회 중에 절대적으로나 상대적으로나 순위가 제일 높아서 기분이 좋네요.

K도 확실히 풀 수 있는 문제인데, 중간에 가족들이랑 식사하고 버스타고 기차타고 하느라 시간이 없어서 그냥 못 풀었습니다.

 

A.

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

 

25175번: 두~~부 두부 두부

첫 번째 줄에 게임을 하는 사람의 수 $N$ ($1 \le N \le 100\,000$), 현재 차례인 사람의 번호 $M$ ($1 \le M \le N$), 부른 두부의 모 수를 나타내는 정수 $K$ ($-100\,000 \le K \le 100\,000$)가 주어진다.

www.acmicpc.net

N명이 있을 때,어떤 사람이 숫자를 외칩니다.

그럼 그 숫자에 해당하는 사람의 번호를 출력해주면 됩니다.

k가 3보다 크면 오른쪽에 있는 거니까 오른쪽에서 찾아주고, 그것보다 작으면 왼쪽에서 찾아주면 됩니다.

오른쪽으로 돌다가 숫자가 사람수보다 커지면 1로,

왼쪽으로 돌다가 0번째 사람은 없으니까 N으로 바꿔주면 됩니다.

 

코드포스였으면 이런 게임을 10만번 한다고 가정해서 제 코드대로 풀면 시간초과가 나겠죠? 

#include <stdio.h>
int main() {
    int n,m,k;
    scanf("%d %d %d", &n, &m, &k);
    if(k >= 3) {
        for(int i = 3; i < k; i++) {
            m++;
            if(m > n) {
                m = 1;
            }
        }
    }
    else {
        for(int i = 3; i > k; i--) {
            m--;
            if(m == 0) {
                m = n;
            }
        }
    }

    printf("%d", m);
}

 

B.

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

 

25176번: 청정수열 (Easy)

예시로 $[3, 1, 2, 1, 3, 2]$는 $N$이 $3$인 청정수열이고 이 청정수열의 점수는 다음과 같이 계산되어 $50$점이 된다. $1$과 $1$의 사이의 수들은 $[1,2,1]$ 이다. 따라서 $(1+2+1)\ ×\ 1$을 점수에 더한다. $2$

www.acmicpc.net

 

청정수열의 개수를 구하면 됩니다.

청정수열이려면 각 정수들이 서로 붙어있어야겠죠? ex) 11223344 44332211

한 쌍의 정수를 한 묶음으로 보고, 나열하면 정답.

정답은 N!이 됩니다.

 

 

C.

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

 

25177번: 서강의 역사를 찾아서

성현이(dart)가 신입생이었을 때의 학교는 지금과 많이 다른 모습이었다. 예를 들어 학식은 우정관뿐 아니라 엠마오관에도 있었다. 서강식객 자리에는 파파이스가 있었고, 김대건관(K관) 건너편

www.acmicpc.net

예전 시설 - 현재 시설의 값이 가장 큰 경우를 출력하면 됩니다.

예제 2번의 경우처럼 입력을 받지 않은 경우엔 0으로 취급해주면 되겠죠?

배열 입력 후 간단한 사칙연산입니다.

 

D.

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

 

25178번: 두라무리 휴지

기령이는 어느 날 캠릿브지 대학의 연결구과에 대해 알게 되었다. 캠릿브지 대학의 연결구과란, 단어를 이해함에 있어 한 단어 안에서 글자들이 어떤 순서로 배열되어 있는지는 중요하지 않고,

www.acmicpc.net

조건 1번 '단어를 재배열해 다른 단어를 만들 수 있어야 한다.' 는 알파벳의 개수를 세줘서 둘이 개수가 동일한지 확인.

조건 2번 첫 글자와 마지막 글자는 동일. s1[0], s2[0], s1[strlen(s1)], s2[strlen(s1)]가 동일한지 확인.

조건 3번 모음 제외하면 동일. 투포인터로 모음이면 넘기면서 동일한지 확인해줬습니다.

 

E.

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

 

25179번: 배스킨라빈스~N~귀엽고~깜찍하게~

준서가 주어진 $N, M$에 대해 이길 수 있다면 Can win을 출력하고, 이길 수 없다면 Can't win을 출력한다.

www.acmicpc.net

베스킨라빈스 게임에서 준서가 무조건 이길 수 있는지 확인하는 문제입니다.

준서가 첫번째입니다.

준서 상대방
2 3 ~ 5
... ...
22 23 ~ 25
26 27 ~ 29
30 31

(마지막 수 - 1) % (한 턴에 부를 수 있는 수의 개수 + 1) > 한 턴에 부를 수 있는 수의 개수 

or

(마지막 수 - 1) % (한 턴에 부를 수 있는 수의 개수 + 1) == 0 이라면 준서 패배 

나머지는 준서 승리

 

 

F.

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

 

25180번: 썸 팰린드롬

재혁이는 최근에 두람이와 썸을 타기 시작했다. 어느 날 재혁이가 귀찮아진 두람이는 재혁이에게 말했다.  "내가 정수 $N$을 줄 테니 각 자릿수의 합(sum)이 $N$이 되는 썸 팰린드롬 수의 최소 자

www.acmicpc.net

이건 솔직히 노가다로 구했습니다.

스스로 브루트포스 해서 깨달았어요

#include <stdio.h>

int main() {
    int n, answer = 0;
    scanf("%d", &n);
    int temp;
    temp = 1 + n / 9;
    if(n % 9 == 0) {
        temp--;
    }
    if(n <= 9) {
        answer = 1;
    }
    else if(temp % 2 == 1) {
        answer = temp;    
    }
    else{
        answer = temp + n % 2;
    }
    printf("%d", answer);
}

 

 

G.

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

 

25181번: Swap the elements

조건을 만족하는 수열 $B_1,B_2, \cdots, B_N$을 만들 수 없다면 첫째 줄에 -1을 출력한다. 만들 수 있다면, 첫째 줄에 $B_1,B_2, \cdots, B_N$을 아무거나 하나 출력한다.

www.acmicpc.net

길이가 N인 수열에서 무제한으로 Swap 했을 때 숫자 위치가 다른, 그러니까

1 1 2 2의 경우, 2 2 1 1처럼 옮긴 이후에 숫자가 같은 위치에 있지 않도록 하는 문제입니다.

숫자의 범위가 10만까지밖에 안되니까 10만개의 배열로 숫자를 각각 세서

똑같은 숫자의 개수 > (N / 2) 라면 만들 수 없습니다.

예를 들어 N = 5, 그 안의 정수 2가 3개라면 

1 1 2 2 2

2 2 2 1 1

어떻게 움직여도 2 하나는 만나죠?

여기까지는 쉬운 생각이고 출력이 힘들어요.

N이 5000개 밖에 없으니까 똑같은 숫자를 만나면 넘기는 식으로 시간안에 잘 출력해줍시다.

 

 

I.

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

 

25183번: 인생은 한 방

첫째 줄에 로또 문자열의 길이 $N(5 \leq N \leq 100\,000)$이 주어진다.  둘째 줄에 로또 문자열 $S$가 주어진다. 

www.acmicpc.net

연속되는 알파벳이 5개인지 확인해주세요

 

 

J.

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

 

25184번: 동가수열 구하기

수열 $[2, 4, 1, 3]$은 $1$ 이상 $4$ 이하인 정수로 이루어져 있고, 모든 원소가 서로 다르다. 또한, 이웃한 원소의 차가 모두 $\lfloor \frac{4}{2} \rfloor$ $=$ $2$ 이상이다. 따라서 수열 $[2, 4, 1, 3]$은 동가

www.acmicpc.net

공책에 적어보면서 깨달았습니다.

#include <stdio.h>
int main() {
    int n;
    scanf("%d", &n);
    int arr[50001] = {};
    int temp = (n / 2);
    for(int i = 1; i <= n; i++) {
        if(i + i > 5000) break;
           arr[i + i] = i;
           arr[i + 1 + i] = temp + i + 1; {
               if(arr[i + 1] > n) {
                   arr[i + 1] = 0;
               }
           }
    }
    arr[1] = n / 2 + 1;
    for(int i = 1; i <= n ;i++) printf("%d ", arr[i]);  
}
//4 1 5 2 6 3
//4 1 5 2 6 3 7 
//3 1 4 2

주석처럼 출력될 수 있게 해주세요.

 

K는 쉬운 구현문제라 잘 구현해주시면 됩니다. 저는 시간이 없어서 못풀었어요.

 

L은 문제 이해를 잘 못했습니다. 근데 예제 보니까 느낌 와서 풀었는데 틀리더라고요.

예쁜 뱃지도 받았습니다.

 

문제가 간결하고 재밌었던 거 같아요.

푼 문제중에 A. 두부 두부 문제가 제일 어려웠습니다.

 

혹시 오류 있다면 알려주세요. 감사합니다.

 

 

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

 

15927번: 회문은 회문아니야!!

팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다. 팰린드롬의 예시로 POP, ABBA 등이 있고, 팰린드롬이 아닌 것의 예시로 ABCA, PALINDROME 등이 있다. 같은 의미를 가지는 여러 단어들을

www.acmicpc.net

 

 

안녕하세요. 오랜만에 한 번에, 실수 없이, 빠른 시간에 맞은 골드 문제입니다.

문제는 간단합니다.

문자열을 입력받아서 팰린드롬이 아닌 부분의 길이를 출력하면 되는 것입니다.

 

예제 1번 보시면 ABCBA는 팰린드롬이죠?

앞이나 뒤에서 A를 빼면 팰린드롬이 아닙니다.

 

AABBAA 팰린드롬, 앞이나 뒤에서 빼면 아닙니다.

 

감이 오셨나요? 

일단 제일 앞, 뒤에서 부터 하나씩 짝을 지어서 문자를 검사해줍니다.

이렇게 검사를 했을 때 전부 똑같다면 팰린드롬이겠죠.

저는 문자열의 길이 / 2 만큼 검사를 해줬는데요, 단어가 홀수인 경우에도 문제가 되지 않습니다.

어차피 앞에서부터 전부 똑같았다면 가운데의 문자는 어떻든 팰린드롬이기 때문이죠.

만약 팰린드롬이라면 앞이나 뒤에서 하나만 빼줘도 팰린드롬이 아니게 됩니다. 어떤 팰린드롬도 이 공식은 적용됩니다.

 

이렇게 해서

팰린드롬이라면 : 문자열 길이 - 1

팰린드롬이 아니라면 : 문자열 길이

전부 똑같다면 : -1

을 출력해주면 됩니다.

 

반례 알려드릴게요

ABABABABA
8

ABABABAB
8

ABCABCABC
9

BBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBB 
52

BBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBB 
34

BBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBBB 
36

 

제 코드 알려드릴게요

 

#include <stdio.h>
#include <string.h>

int main() {
    char s[500000] = {};
    int check = 0;
    scanf("%s", s);
    for(int i = 0; i < strlen(s)/2; i++) {
        if(s[i] != s[strlen(s) - 1 - i]) {
            check = 1;
        }
    }
    int same = 1;
    for(int i = 0; i < strlen(s) - 1; i++) {
        if(s[i] != s[i + 1]) same = 0;
    }
    if(same == 1) printf("-1");
    else if(check == 1) printf("%lu", strlen(s));
    else if(check == 0) printf("%lu", strlen(s) - 1);
}

 

+ Recent posts