IJY
느리더라도 꾸준히
IJY
전체 방문자
오늘
어제
  • 분류 전체보기 (67)
    • Develop (67)
      • Java (8)
      • Go (0)
      • Test (1)
      • Web (1)
      • HTML, CSS (1)
      • TIL(Today I Learned) (18)
      • SQL (0)
      • Algorithm (27)
      • 회고 (7)
      • Troubleshooting (1)
      • Etc (3)
    • Etc (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 재귀
  • init
  • object
  • Filter
  • stream
  • recursion
  • instance
  • 12921
  • web
  • BufferedWriter
  • 초기화
  • Class
  • MVC
  • 프로그래머스
  • 회고
  • 독후감
  • BufferedReader
  • 우테코 온보딩
  • 알고리즘
  • EntityTransaction
  • 백준
  • 소수 찾기
  • Spring
  • PostConstruct
  • html
  • Interceptor
  • REST Assured
  • sort
  • java
  • API 예외 처리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
IJY

느리더라도 꾸준히

Develop/Algorithm

프로그래머스 Lv.1 - 12930 이상한 문자 만들기

2022. 7. 26. 09:07

프로그래머스 Lv.1 - 12930 이상한 문자 만들기 문제 풀이

 

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다.

각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

 

문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크

 

풀이 코드

class Solution {
    public String solution(String s) {
        StringBuilder ret = new StringBuilder();    // 반환할 문자열을 담을 StringBuilder 타입 변수 생성
        for(String str : s.split(" ", -1)) {    // 입력받은 문자열 s를 공백 단위로 파싱, 마지막 공백 포함
            for(int i = 0; i < str.length(); i++) { // 공백 단위로 파싱된 문자열의 길이만큼 반복
                if(i % 2 != 0) {    // 만약 i값이 홀수면
                    ret.append(Character.toLowerCase(str.charAt(i)));   // 문자열의 i번째 인덱스를 소문자로 변환 후 ret에 추가
                } else {    // 만약 i값이 짝수면
                    ret.append(Character.toUpperCase(str.charAt(i)));   // 문자열의 i번째 인덱스를 대문자로 변환 후 ret에 추가
                }
            }
            ret.append(" ");    // ret에 공백 추가
        }
        return ret.substring(0, ret.length() - 1);  // ret의 마지막 공백을 제외하고 String 타입 변환하여 반환
    }
}

 

문제 해결 전략

이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목

문제에서 문자열의 공백을 기준으로 파싱이 필요하다는 내용을 보자마자 split() 메서드 사용을 떠올리고, 입력받은 문자를 변환한 후 반환해야 한다는 내용 확인 후 StringBuiler로 만들어서 반환을 해야겠다고 생각

따라서 StringBuiler 변수를 생성 후, 입력받은 문자열에 split() 메서드를 사용하여 공백 기준 파싱된 문자열을 향상된 for문에 대입하여 사용하는 코드 작성

이후 파싱된 문자열의 길이만큼 돌면서 인덱스 기준으로 홀수와 짝수를 판별 후 대소문자로 변환하여 ret 변수에 추가

파싱된 문자열의 대소문자 변환이 끝났다면 ret에 공백을 추가 (공백 기준으로 파싱했기 때문에 공백을 추가해줘야 원본 문자열과 동일한 문자열이 만들어지기 때문)

모든 문자열의 대소문자 변환이 끝났다면 StringBuilder 타입에서 String 타입으로 변환이 필요하기 때문에 toString() 메서드를 사용하면 되지만.. 문자열 마지막에 추가되었을 공백을 제거해야하기 때문에 trim() 메서드를 떠올림

하지만 trim() 메서드의 경우 문자열의 맨 앞과 맨 뒤에 있는 모든 공백을 제거하기 때문에 원본 문자열의 맨 앞과 맨 뒤에 공백이 있는 경우가 들어온다면 실패하기 때문에 제외

따라서 substring() 메서드를 활용하여 ret의 길이에서 1을 뺀 문자열을 String 타입으로 변환하여 반환하도록 구현

 

여기까지 진행 후 테스트 실행시 4, 5, 8, 9, 11번 케이스에서 실패가 발생

 

무엇이 문제일지 고민을 시작하였으나 일반적인 문자의 경우에는 정상인 코드가 맞으므로 공백 관련된 문제로 인식

따라서 공백을 기준으로 파싱하는 split() 메서드에 대해서 찾아보기 시작

찾아보던 중 split() 메서드를 첫번째 매개변수만 지정하여 사용하게 되면 길이가 0인 문자열은 제외됨을 확인

이 문제의 해결 방법으로는 split() 메서드에 2개의 매개변수를 사용할 때, 2번째 매개변수에 음수를 넣으면 길이가 0인 문자열도 포함하여 나오도록 할 수 있음을 확인 (링크)

이를 확인하고 split() 메서드의 코드를 수정 후 테스트 진행하여 성공 확인

 

해당 문제를 풀면서 split() 메서드의 동작에 대해 좀 더 알 수 있는 계기가 되었다.

 


코드를 업로드해 둔 깃 허브

'Develop > Algorithm' 카테고리의 다른 글

백준 브론즈I - 10989 수 정렬하기 3  (0) 2022.07.26
백준 실버V - 2751 수 정렬하기  (0) 2022.07.26
백준 브론즈II - 5622 다이얼  (0) 2022.07.26
Java BufferedReader, BufferedWriter 사용법  (0) 2022.07.26
백준 코드 작성시 참고 항목  (0) 2022.07.26
    'Develop/Algorithm' 카테고리의 다른 글
    • 백준 실버V - 2751 수 정렬하기
    • 백준 브론즈II - 5622 다이얼
    • Java BufferedReader, BufferedWriter 사용법
    • 백준 코드 작성시 참고 항목
    IJY
    IJY
    개발 관련 공부한 내용을 정리하는 블로그입니다. 느리더라도 꾸준히 포스팅을 하려고 노력합니다.

    티스토리툴바