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;
}
}