항해 99클럽 코테

99클럽 코테 스터디 2일차 TIL

metamong-data 2024. 10. 29. 16:49
728x90
반응형

오늘의 학습 키워드

문자열

과제

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

풀이 과정

  1. p의 개수에 따라서 t에서 가져올 숫자 개수가 달라지기에 p의 개수를 제일 먼저 계산하고자 했다!
  2. list comprehension을 이용해서 최대한 짧은 줄을 사용하고 연산 속도를 줄이고자 했다!
  3. 포기했다! 먼가 꼬여서 산으로 가는 것을 확인하고, 일단 문제 풀기에 집중 했다!
  4. i를 기준으로 p의 문자열을 하나씩 옮기고 p의 길이만큼 list slice를 이용해서 p와 크기를 비교해서 하고자 했다.
  5. t길이 보다 많은 수를 list slice를 이용하더라도 오류가 나지 않는 것을 알게 되었고, t개수가 i+ plength가 넘치지 않도록 조건을 주어서 문제를 풀었다!

제출 코드

def solution(t, p):
    answer = 0
    plength = len(p)
    i = 0
    while t[i:i+plength] and len(t) >=i+plength:
        if t[i:i+plength] <= p:
            answer+=1
        i+=1
    return answer

다른 언어로 문제 풀기

C언어

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

int solution(const char* t, const char* p) {
    int answer = 0;
    int p_length = strlen(p);
    int t_length = strlen(t);
    
    for(int i = 0; i <= t_length - p_length; i++) {
        // 직접 문자 비교
        int j;
        for(j = 0; j < p_length; j++) {
            if(t[i + j] != p[j]) {
                break;
            }
        }
        
        // 같은 자리수까지 같다면 마지막 비교한 문자로 판단
        if(j == p_length || t[i + j] < p[j]) {
            answer++;
        }
    }
    
    return answer;
}

int main() {
    printf("%d\\n", solution("3141592", "271"));      // 2
    printf("%d\\n", solution("500220839878", "7"));   // 8
    
    return 0;
}

C++

#include <string>
#include <vector>
using namespace std;

int solution3(string t, string p) {
    int answer = 0;
    int p_length = p.length();
    int t_length = t.length();
    
    for(int i = 0; i <= t_length - p_length; i++) {
        bool is_less_or_equal = true;
        for(int j = 0; j < p_length; j++) {
            if(t[i + j] > p[j]) {
                is_less_or_equal = false;
                break;
            }
            else if(t[i + j] < p[j]) {
                break;
            }
        }
        if(is_less_or_equal) answer++;
    }
    
    return answer;
}

int main() {
	  cout << solution3("3141592", "271") << endl;       // 2
    cout << solution3("500220839878", "7") << endl;    // 8
    
    return 0;
}

오늘의 회고

  • 문제를 푸는데 집중하고 난 후에 최적화 하는 방향으로 해야겠다!
  • 여러가지 언어를 이용해서 풀어보고, 이해하자!

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12916

728x90