[공부] 261001 - 문자열 다루기 2

강현구
∙∙조회 4

 

Q2. 첫 표시 구간 교체

csharp
using System;

//원본 문장과 교체 내용을 한 줄씩 입력받
Console.Write("원본 문장: ");
string origin = Console.ReadLine();
Console.Write("교체 내용: ");
string change = Console.ReadLine();

//원본의 첫 [부터 그 뒤에 처음 나오는 ]까지를 대괄호를 포함해
//교체 내용으로 바꿈.

//완성된 구간이 없으면 원본을 그대로 둠

//대괄호는 중첩되지 않으며 두 입력 모두 빈 문자열일 수 있음.


//Remove와 Insert의 첫 인수는 시작 인덱스임
//Remove의 두 번째 인수는 지울 코드 단위의 개수이며,
//Insert의 두 번째 인수는 끼워 넣을 문자열임.



Console.WriteLine($"원본: [{origin}]");

string result = origin.Remove(3, 4);

Console.WriteLine($"결과: [{result.Insert(3, change)}]");


  • 소요시간 - 20분
  • AI 질문? - 함 (Remove, Insert 동작 방식과 원본이 안 바뀌는 이유에 대한 개념 질문. 코드 답은 안 받음)

 

어려웠던 이유?

  • 문제 문장이 길어서 처음 봤을 때 막막하고 손이 안 감
  • Remove(3, 6)을 "3번부터 6번까지"로 착각함 (두 번째 인수는 끝 위치가 아니라 지울 개수)
  • origin.Remove(3, 4);만 쓰고 결과를 변수에 안 받아서, 지운 게 반영되지 않음 (문자열 함수는 원본을 안 바꾸고 새 문자열을 돌려줌)

 

어떻게 풀었나?

  • 예상 결과를 보고 "첫 번째 [철수]를 통째로 영희로 바꾸는 것"으로 문제를 단순하게 정리
  • 칸 번호를 직접 세서 [는 3번, ]는 6번임을 찾음
  • 지울 개수 = 끝 - 시작 + 1 = 6 - 3 + 1 = 4
  • Remove(3, 4)의 결과를 result에 받고, 그 위에 Insert(3, 교체 내용)
  • 원본은 그대로 두고 result만 바꿔서 원본, 결과 둘 다 출력

 

남은것

  • 3과 4를 직접 넣지 않고 IndexOf('['), IndexOf(']')로 찾게 바꾸기
  • [나 ]가 없으면 원본 그대로 두기

 

알게된점

  • Remove(시작, 개수), Substring(시작, 개수) 둘 다 두 번째는 개수
  • 문자열 함수는 원본을 바꾸지 않으므로 결과를 꼭 변수에 받아야 함
  • 막막한 문제는 예상 결과부터 보고 "무엇이 무엇으로 바뀌었나"를 먼저 말로 정리하면 단순해짐

Q3. 마지막 두 숫자 남기기

csharp

csharp
char[] chars = origin.ToCharArray();

int digitTotal = 0;
for (int i = 0; i < chars.Length; i++)
{
    if (char.IsDigit(chars[i]))
    {
        digitTotal++;
    }
}

int digitSeen = 0;
for (int i = 0; i < chars.Length; i++)
{
    if (char.IsDigit(chars[i]))
    {
        digitSeen++;
        if (digitSeen <= digitTotal - 2)
        {
            chars[i] = '*';
        }
    }
}

string result = new string(chars);
  • 소요시간 - 약 30분 (밤 11시 이후)
  • AI 질문? - 함 (IsDigit, ToCharArray 사용법, 숫자 순번으로 세는 방법)

어려웠던 이유?

  • "숫자 중 마지막 두 개"를 처음엔 "문자열 앞 두 개, 뒤 두 개"로 읽음
  • Replace로 숫자 전체를 한 번에 바꾸려 했는데, Replace는 정확히 그 글자만 바꿀 수 있음
  • "문자열 끝에서 -2"로 멈추는 가설을 세웠는데, 끝 두 글자가 숫자가 아니면 틀림 (예: 12-34-AB)
  • 밤 11시 넘으면 머리가 잘 안돌아감

어떻게 풀었나?

  • char.IsDigit으로 글자 하나가 숫자인지 판별
  • ToCharArray로 문자열을 수정 가능한 배열로 바꿈
  • for 한 번으로 숫자 총 개수를 먼저 셈
  • for 한 번 더 돌면서 몇 번째 숫자인지 세고, 마지막 두 개가 아니면 *
  • new string(chars)로 다시 문자열로

남은 것

  • 내일 이 코드 안 보고 빈 파일에서 다시 치기
  • 출력 제목 코드: → 결과:

알게된것

  • 종류(숫자 전체)로 바꿀 땐 Replace가 아니라 IsDigit + 반복문
  • 문자열은 직접 못 바꾸니까 배열로 바꿔서 고치고 다시 문자열로
  • "글자 위치" 기준이랑 "숫자 순번" 기준은 다르다. 예시 하나만 넣지 말고 모양이 다른 입력으로도 확인하기

 


오늘 평가: F

  • 20분 내로 풀지 못함
  • AI한테 질문 횟수 4번 이상
  • 완벽히 이해하지 못함

 

 

 

 

 

 

 

 

 

 

 

 




문제 템플릿

 

문제 번호

csharp

 

  • 소요시간 - 20분
  • AI 질문? - 함

 

어려웠던 이유?

  •  

 

어떻게 풀었나?

  •  

 

남은 것

  •  

 

알게된것

  •