Coding Test/Java Coding Test

[프로그래머스 / 자바] - 문자열 여러 번 뒤집기

nam_ji 2024. 9. 17. 11:40

문자열 여러 번 뒤집기

문제

  • 문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다.
  • queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다.
  • my_string에 queries의 명령을 순서대로 처리한 후 문자열을 출력하는 문제입니다.


테스트 (인텔리제이)

  • 문제를 처음 이해한 내용은 queries의 원소 값끼리 자리를 바꿔주면 되는 문제인 줄 알았지만 원소 사이의 모든 자리 값을 다 바꿔줘야 한다는 것을 알게 되었습니다.
  • 그래서 우선 for문으로 queries의 크기만큼 반복하도록 해줍니다.
  • 그리고 바꿔야 하는 문자열이 앞부분, 뒷부분, 바뀔부분 이렇게 세개로 나눠질 수 있기 때문에
  • if문으로 queries의 각 원소의 첫 번째 자리 원소 값이 0보다 크면 앞문자열을 나타내는 front 변수에 substring을 이용해서 앞 부분을 저장해줍니다.
  • 두 번째 if문은 queries의 각 원소의 첫 번째 자리 원소 값이 my_string의 크기보다 작으면 뒤문자열을 나타내는 back 변수에 substring을 이용해서 뒤 부분을 저장해줍니다.
  • 마지막으로 남은 부분의 문자열 변환된 문자열로 reverse라는 변수에 담아줍니다. reverse에는 queries의 원소값 사이의 문자들을 서로 바꿔줘야 합니다. 즉, 문자열을 뒤집어 주면 되기 때문에 우선 substring으로 queries의 각 원소의 첫 번째부터 두 번째 원소 + 1까지의 문자열을 저장해주고
    (substring은 마지막 문자 전까지 저장해줍니다.)
  • StringBuilder의 reverse 메서드로 문자열을 뒤집어줍니다.
  • 마지막으로 반환하려는 answer 변수를 setLength 메서드를 이용해 초기화 해주고
  • append 메서드로 front, reverse, back 순서로 answer에 저장해줍니다.
  • 두 번째 풀이는 더 간단한 풀이입니다.
  • queries의 크기만큼 for문을 반복해줍니다.
  • 이후 queries의 start를 나태나는 s에 qeuries의 각 원소의 첫 번쨰 원소를 end를 나타내는 e에 queries의 각 원소의 두 번째 원소를 담아줍니다.
  • 첫 번째와 동일한 방법인 reverse 변수에 substring을 이용하여 s부터 e + 1까지 문자열을 잘라 저장하고 reverse 메서드를 이용하여 문자열을 뒤집어 줍니다.
  • 마지막으로 if문으로 s가 0이면 answer에 reverse와 answer를 e + 1까지 substring 메서드로 자른 문자열을 더해줍니다.
  • else문으로 answer를 substring으로 0부터 s까지 + reverse + answer를 substring으로 e + 1까지 연산해주면 됩니다.
package com.namji.codingtest.unsuccess;

public class 문자열_여러_번_뒤집기 {
  public static void main(String[] args) {
    /*
    문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다.
    queries의 원소는 [s, e] 형태로,
    my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다.
    my_string에 queries의 명령을 순서대로 처리한 후
    문자열을 출력하는 문제입니다.

    입출력 예
    my_string	    queries	                          result
    "rermgorpsam"	[[2, 3], [0, 7], [5, 9], [6, 10]]	"programmers"

    입출력 설명
    | queries | my_string   |
    |---      | ---         |
    |         |"rermgorpsam"|
    |[2, 3]   |"remrgorpsam"|
    |[0, 7]   |"progrmersam"|
    |[5, 9]   |"prograsremm"|
    |[6, 10]  |"programmers"|
     */
//    String my_string = "rermgorpsam";
//    int[][] queries = {{2, 3}, {0, 7}, {5, 9}, {6, 10}};
//    StringBuilder answer = new StringBuilder(my_string);
//
//    for (int i = 0; i < queries.length; i++) {
//      StringBuilder front = new StringBuilder();
//      StringBuilder back = new StringBuilder();
//      StringBuilder reverse = new StringBuilder();
//      if (queries[i][0] > 0) {
//        front.append(answer.substring(0, queries[i][0]));
//      }
//      if (queries[i][1] < my_string.length()) {
//        back.append(answer.substring(Math.min(queries[i][1] + 1, my_string.length())));
//      }
//      reverse.append(answer.substring(queries[i][0], Math.min(queries[i][1] + 1, answer.length())));
//      reverse.reverse();
//      answer.setLength(0);
//      answer
//          .append(front)
//          .append(reverse)
//          .append(back);
//    }
//
//    System.out.println(answer);

    String my_string = "rermgorpsam";
    int[][] queries = {{2, 3}, {0, 7}, {5, 9}, {6, 10}};
    String answer = my_string;

    for (int i = 0; i < queries.length; i++) {
      int s = queries[i][0];
      int e = queries[i][1];

      StringBuilder reverse = new StringBuilder(answer.substring(s, e + 1));
      reverse.reverse();

      if (s == 0) {
        answer = reverse + answer.substring(e+1);
      } else {
        answer = answer.substring(0, s) + reverse + answer.substring(e+1);
      }
    }

    System.out.println(answer);
  }
}

프로그래머스 코드

// class Solution {
//     public StringBuilder solution(String my_string, int[][] queries) {
//         StringBuilder answer = new StringBuilder(my_string);
        
//         for (int i = 0; i < queries.length; i++) {
//             StringBuilder front = new StringBuilder();
//             StringBuilder back = new StringBuilder();
//             StringBuilder reverse = new StringBuilder();
//             if (queries[i][0] > 0) {
//                 front.append(answer.substring(0, queries[i][0]));
//             }
//             if (queries[i][1] < my_string.length()) {
//                 back.append(answer.substring(Math.min(queries[i][1] + 1, my_string.length())));
//             }
//             reverse.append(answer.substring(queries[i][0], Math.min(queries[i][1] + 1, answer.length())));
//             reverse.reverse();
//             answer.setLength(0);
//             answer
//                 .append(front)
//                 .append(reverse)
//                 .append(back);
//         }
        
//         return answer;
//     }
// }

class Solution {
    public String solution(String my_string, int[][] queries) {
        String answer = my_string;
        
        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            
            StringBuilder reverse = new StringBuilder(answer.substring(s, e + 1));
            reverse.reverse();
            
            if (s == 0) {
                answer = reverse + answer.substring(e + 1);
            } else {
                answer = answer.substring(0, s) + reverse + answer.substring(e + 1);
            }
        }
        
        return answer;
    }
}