오늘은 스프링 심화 강의 복습을 하면서 개인 과제도 진행해보는 시간을 가졌다. 그간 강의를 들으면서 완전히 이해 못했던 부분이나 코드들을 이해하려다보니 시간이 훌쩍 지나갔다. 내일 정도면 과제 필수 구현 부분은 끝마칠 수 있을 것 같다.
여기에는 오늘 풀어본 알고리즘 문제 풀이 내용을 간단히 정리해보았다.
1. 알고리즘 문제 풀이
오늘은 프로그래머스에 있는 '문자열 여러 번 뒤집기' 문제를 풀어보았다.
1-1. 풀어본 문제
[문제]
문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.
- 제한사항
- my_string은 영소문자로만 이루어져 있습니다.
- 1 <= my_string.length <= 1000
- queries의 원소는 [s, e]의 형태로 0 <= s <= e < my_string의 길이를 만족합니다.
- 1 <= queries.length <= 1000
- 입출력 예시
my_string | queries | result |
"rermgorpsam" | [[2,3],[0,7],[5,9],[6,10]] | "programmers" |
- 입출력 예시 설명
- 예제 1번의 my_string은 "rermogorpsam"이고 주어진 queries를 순서대로 처리하면 다음과 같습니다.
queries | my_string |
"rermgorpsam" | |
[2,3] | "remrgorpsam" |
[0,7] | "progrmersam" |
[5,9] | "prograsremm" |
[6,10] | "programmers" |
1-2. 문제 풀이
아주 간단한 문제이다. 결국 쿼리들로 문자열을 어떻게 변환할 것인지가 중요한 문제이고, 문자열을 잘 다룰줄 안다면 쉽게 해결할 수 있는 문제이다.
여러가지 방법이 떠올랐는데 StringBuilder를 이용하면 조금 더 실행시간을 줄일 수 있지 않을까 싶어서 StringBuilder를 이용해 보았다.
정말 단순하게 문자열에서 0~(s-1) 인덱스에 해당하는 문자들은 그대로 StringBuilder에 집어넣고, s~e의 해당하는 인덱스의 문자들은 뒤집어서 StringBuilder에 넣고 e+1에서 마지막까지의 문자들은 또 그대로 StringBuilder에 넣어주었다. 그런 다음 String 생성자를 이용해 문자열을 만들어주었다.
그에 따라 작성한 코드는 아래와 같다.
class Solution {
fun solution(my_string: String, queries: Array<IntArray>): String {
var answer = my_string
for (query in queries) {
val sb = StringBuilder()
// 0~(s-1) 까지의 인덱스
for (i in 0..query[0]-1) {
sb.append(answer[i])
}
// s~e 까지의 인덱스
for (j in (query[0]..query[1]).reversed()) {
sb.append(answer[j])
}
// e+1~마지막 까지의 인덱스
for (k in (query[1]+1)..answer.length-1) {
sb.append(answer[k])
}
answer = String(sb)
}
return answer
}
}
위와 같이 작성했더니 길지 않은 실행시간으로 잘 답안이 통과되었다.
얼마 전만 해도 위와 같은 문제를 풀려면 고민도 많이하고 코드 작성도 많이 더뎠는데 이제는 위와 같은 문제는 어렵지 않게 풀 수 있게된 것 같다.
오늘은 과제를 하느라 시간이 많이 없었는데 하루에 한 문제씩은 꼭 고민이 많이 필요한 문제를 하나씩 꼭 풀어보도록 해야겠다.
2. 오늘 배운 것
- JWT를 발급하고 인증하는 과정에 대해 자세히 살펴보았다. 이제 어느정도 잘 알게 된 것 같다.
- Spring Security의 동작 방식도 어느 정도는 이해가 되긴 했지만 아직 정확히 파악하는데에는 시간이 좀 걸릴 것 같다.
'오늘 배운 것' 카테고리의 다른 글
24-06-09 Spring 개인 과제 (2) (0) | 2024.06.09 |
---|---|
24-06-08 Spring 개인 과제 (0) | 2024.06.08 |
24-06-06 Spring 설정 값 주입하기 (0) | 2024.06.06 |
24-06-05 알고리즘 문제 풀이 (0) | 2024.06.05 |
24-06-04 JPA @MappedSuperClass (0) | 2024.06.04 |