Problem 💻

https://school.programmers.co.kr/learn/courses/30/lessons/120826

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

문자열 my_string과 문자 letter이 매개변수로 주어집니다. my_string에서 letter를 제거한 문자열을 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ my_string의 길이 ≤ 100
  • letter은 길이가 1인 영문자입니다.
  • my_string과 letter은 알파벳 대소문자로 이루어져 있습니다.
  • 대문자와 소문자를 구분합니다.

입출력 예my_stringletterresult
"abcdef" "f" "abcde"
"BCBdbe" "B" "Cdbe"

입출력 예 설명

입출력 예 #1

  • "abcdef" 에서 "f"를 제거한 "abcde"를 return합니다.

입출력 예 #2

  • "BCBdbe" 에서 "B"를 모두 제거한 "Cdbe"를 return합니다.

Approach 1 ❌ - 나의 초기 접근법

이 문제는 String들의 내용을 주어진 문자와 일치하는지는 for문으로 순회하며 if문을 통해 일치한다는 조건으로 리턴으로는 String에서 해당 요소를 삭제하는 것이다.

 

1. StringBuilder를 통해 String의 문자들을 Char형태로 분리하기 위해서 StringBuilder 객체 생성.

 

2. Char형태의 것의 묶음인 StringBuilder을 순회하며 String 형태의 letter와 일치하는 것을 for문과 if문을 사용해서 작성하였는데,

의문점이 char형태의 한 글자, 한 글자와 String 형태를 대조할 수 있지 않을 것 같다. 문자 형태가 다르다.

 

3. 또한, StringBuilder의 기능 사용이 정확한지 의문이 든다. s.remove()가 맞나...

 

 

class Solution {
    public String solution(String my_string, String letter) {
      StringBuiler s = new StringBuilder(my_string);
      
      for (char n : s) {
        if (n == letter) {
         s.remove(n);
        }
      }
      return s
      
    }
}

Approach 2 ⭕ - 나의 접근법에 대한 교정

코드 검토와 문제점

 

1. StringBuilder와 String의 차이

StringBuilder는 문자열을 동적으로 조작할 수 있는 클래스이다. 하지만 다음과 같은 문제점이 있다.

 

  1.1  for-each 문법의 사용:

StringBuilder는 Iterable이 아니기 때문에 for- each 문법을 사용할 수 없다. 

 Iterable이 무슨뜻일까?
Iterable은 자바에서 “반복 가능한” 객체를 나타내는 인터페이스이다.
쉽게 말해, for-each 문법에서 사용할 수 있는 객체라고 생각하면 된다.

자세한 설명은 밑에 링크에! 

2024.12.28 - [Java/Breaking down Java code] - [Java] StringBuilder는 Iterable이 아니라서 for-each 문법을 사용할 수 없다_(for each를 사용할 수 있는 것들, 없는 것들)

 

[Java] StringBuilder는 Iterable이 아니라서 for-each 문법을 사용할 수 없다_(for each를 사용할 수 있는 것

Iterable은 자바에서 “반복 가능한” 객체를 나타내는 인터페이스이다.쉽게 말해, for-each 문법에서 사용할 수 있는 객체라고 생각하면 된다. 1. Iterable의 정의Iterable은 자바의 컬렉션 프레임워

yeonbikim.tistory.com

 

   1.2 remove() 메서드:

StringBuilder에는 remove() 메서드가 존재하지 않는다.

대신 deleteCharAt(int index) 메서드를 사용하여 특정 위치의 문자를 제거할 수 있다.


2. char와 String 비교

char String은 자료형이 다르므로 직접 비교할 수 없다.

이를 해결하려면 다음 중 하나를 선택해야 한다:

char String으로 변환: String.valueOf(n) 또는 Character.toString(n) 사용

String에서 첫 번째 문자를 추출해 char로 변환: letter.charAt(0) 사용


3. StringBuilder 반환 방식

StringBuilder를 직접 반환하려 하면 타입 불일치 오류가 발생한다.

최종 결과를 반환할 때는 StringBuilder toString() 메서드를 사용해야 한다.


Solution 💡- 정답 코드

class Solution {
   public String solution(String my_string, String letter) {
      StringBuilder s = new StringBuilder(my_string); //StringBuilder생성
      char target = letter.charAt(0) // letter의 첫 번째 문자를 char로 추출
      
      for (int i = 0; i < s.length(); i++) { //StringBuilder순회
          if (s.charAt(i) == target) { //문자 비교
              s.deleteCharAt(i); //문자 제거
              i--; //제거 후 인덱스 조정
          }
      }
      return s.toString(); //결과 문자열 반환
   }

}

이 코드의 설명

1. StringBuilder 사용:

StringBuilder는 문자열을 동적으로 변경할 수 있는 클래스이다.

deleteCharAt(int index) 메서드를 사용해 특정 위치의 문자를 삭제할 수 있다.

 

CharAt()의 정의와 활용법도 아래의 링크에!

2024.12.28 - [Java/Breaking down Java code] - [Java] StringBuilder는 Iterable이 아니라서 for-each 문법을 사용할 수 없다_(for each를 사용할 수 있는 것들, 없는 것들)

 

[Java] StringBuilder는 Iterable이 아니라서 for-each 문법을 사용할 수 없다_(for each를 사용할 수 있는 것

Iterable은 자바에서 “반복 가능한” 객체를 나타내는 인터페이스이다.쉽게 말해, for-each 문법에서 사용할 수 있는 객체라고 생각하면 된다. 1. Iterable의 정의Iterable은 자바의 컬렉션 프레임워

yeonbikim.tistory.com

 

2. char String 비교:

letter String이므로, 첫 번째 문자를 char로 변환 (char target = letter.charAt(0))하여 비교한다.

3. 인덱스 조정:

문자를 삭제하면 문자열의 길이가 줄어들기 때문에 i--를 수행해 다음 문자를 올바르게 순회한다.

4. 최종 결과 반환:

StringBuilder 객체를 toString() 메서드를 통해 String으로 변환하여 반환한다.


Reference 📄

 

 

+ Recent posts