[문과 코린이의 IT 기록장] C#


[문과 코린이의 IT 기록장] C# 1
(문과 코린의 IT 저널) C# Programmers – Small substrings

(문과 코린의 IT 저널) C# Programmers – Small substrings


코딩 테스트 실습 | 프로그래머 학교

개발자 취업의 필수 관문인 프로그래밍 시험을 철저히 연습하고 준비할 수 있는 문제를 모두 커버!
프로그래머가 선택한 문제 유형을 파악하고 기술을 연마하세요!

school.programmers.co.kr


1. 문제

1) 문제 설명

숫자 시퀀스 t와 p가 주어지면 t에서 길이가 p인 하위 시퀀스의 발생 횟수를 반환하는 함수 솔루션을 완성합니다.
여기서 해당 하위 시퀀스가 ​​나타내는 숫자는 p가 나타내는 숫자보다 작거나 같습니다.

예를 들어, t=”3141592″ 및 p=”271″인 경우 t에서 길이가 3인 하위 문자열은 314, 141, 415, 159, 592입니다.
141, 159 이 문자열이 나타내는 숫자 중 2개는 작거나 같습니다.
271로.

2) 제한 사항

  • 길이 1 ≤ p ≤ 18
  • p의 길이 ≤ t의 길이 ≤ 10,000
  • t와 p는 숫자로만 구성된 문자열이며 0으로 시작하지 않습니다.

3) 입출력 예

결과
“3141592” “271” 2
“500220839878” “7” 8일
“10203” “15”


두 번째 솔루션

1) 나는 답을 풀었다

using System;
using System.Collections.Generic; 

public class Solution {
    public int solution(string t, string p) {
         
            int plen = p.Length;
            long tlen = t.Length;
            long lp = long.Parse(p);
            // (p의 길이 : 18) 100,000,000,000,000,000
            // int : 2,147,483,647 까지만 가능
            // long : 9,233,372,036,854,775,807 까지 가능.
            // 즉, 최대 18개의 숫자로 이루어진 문자열을, 숫자로 변환할 경우에는 long형식을 사용해야 한다.
int answer = 0; for (int cnt = 0; cnt + plen <= tlen; cnt++) { long lt = long.Parse(t.Substring(cnt, plen)); // 18개의 숫자열이 잘린 후 숫자로 변환하게 되면 long형식을 사용해야 하므로, lt 또한 long 형식 사용 if (lt <= lp) { answer += 1; } } return answer; } }

2) 다른 사람의 솔루션 참조 1

using System;
using System.Collections.Generic; 
using System.Text;

public class Solution {
    public int solution(string t, string p) {
         
           int answer = 0;

            var sb = new StringBuilder();
            // StringBuilder()를 사용하면, 문자열을 조합할 때마다, 새로운 변수를 생성하지 않고 결합 가능
            long n_t = 0;
            // string t를 long형으로 변환
            long n_p = long.Parse(p); 
            // string p를 long형으로 변환

            for (int i = 0; i < t.Length - (p.Length - 1); i++) 
            {
                sb.Clear(); 
                // StringBuilder.Clear() 인스턴스에서 모든 문자를 제거한다.
for (int j = i; j < i + p.Length; j++) { sb.Append(t(j)); // i번째부터 문자 p개 sb에 넣기 } n_t = long.Parse(sb.ToString()); // sb를 long형으로 변경 if(n_t <= n_p) { answer++; } } return answer; } }

3) 다른 사람의 솔루션 확인 2

using System;

public class Solution {
    public int solution(string t, string p) {
         
       int answer = 0;

            for (int i = 0; i < t.Length - p.Length + 1; i++) // 횟수 (부분 문자열 경우의 수)
            {
                for (int j = 0; j < p.Length; j++) // p 길이
                {
                    if (t(i + j) > p(j)) break; 
                    // t의 j번째 자리 수가, p의 j번째 자리 수보다 크다면, t가 p보다 큰 값을 가지므로 break
                    
                    if (t(i + j) == p(j))  // t의 j번째 자리 수가, p의 j번째 자리 수와 같다면
                    {
                        if (j == p.Length - 1) // and j가 마지막 자리 수라면
                        {
                            answer++; // 같은 값이므로 answer ++
                        }
                    }// j가 마지막 자리 수가 아니라면, 다음으로

                    if (t(i + j) < p(j)) 
                    // t의 j번째 자리수가, p의 j번째 자리수보다 작다면, 
                    {
                        answer++; // t가 p보다 작은 값을 가지므로 answer ++
                        break;
                    }
                }
            }

            return answer;
    }
}