이번 문제는 문제 자체를 이해하기가 좀 어렵다.
문제를 잘 해석해 보면…
우선 Example 1 의 인풋과 아웃풋을 보자
abcdefg 와 2가 인풋이다.
여기서 요구하는 사항은 두번째 글자를 첫번째 글짜와 Reverse 하라는 거다.
그래서 아웃풋을 보면 abcd가 bacd 가 되었다.
그 다음 요구는 각각의 2k 마다 이 일을 하라는 거다.
여기서 인풋 k = 2이기 때문에 2 * 2 = 4 마다 이 일을 하라는 거다.
즉 abcd는 일을 다 끝냈고 그 다음에 남은건 efg 이니까 여기서 두번째 글자와 첫번째 글자의 위치를 바꾸라는 거다.
아래 스크립트로 원하는 답을 얻을 수 있다.
class Solution {
public String reverseStr(String s, int k) {
char[] a = s.toCharArray();
for (int start = 0; start < a.length; start += 2 * k) {
int i = start, j = Math.min(start + k - 1, a.length - 1);
while (i < j) {
char tmp = a[i];
a[i++] = a[j];
a[j--] = tmp;
}
}
return new String(a);
}
}
한줄 한줄 분석해 보자.
class Solution { ==> 클래스 이름은 Solution이다.
public String reverseStr(String s, int k) {
==> 메소드 이름은 reverseStr이고 입력값으로 스트링 s , int k 를 받는다. return 값은 String이다.
char[] a = s.toCharArray();
==> 입력받은 스트링을 toCharArray()를 이용해서 배열로 만들고 변수 a 에 할당한다.
for (int start = 0; start < a.length; start += 2 * k) {
==> 루프를 만들어 start가 배열 아이템 갯수 보다 작을 때 까지 돌린다. start는 초기 값이 0이고 루프 한번 돌면 start 값은 start + 2 * k 만큼 증가한다.
int i = start, j = Math.min(start + k - 1, a.length - 1);
==> inti 에는 start 값이 대입된다. Int j 에는 start + k 값과 a.length - 1 값 중 작은 값이 대입 된다.
==>
while (i < j) {
==> i 가 j 보다 작을 때 까지만 while문을 돌린다. 즉 2*k 블럭이 더이상 없으면 while문은 종료한다.
char tmp = a[i];
==> tmp에 배열의 첫번째 값을 대입한다.
a[i++] = a[j];
==> a 의 첫번째 값에 j의 값을 대입한다. 그리고 i 에 1을 더해 준다.
a[j--] = tmp;
==> 배열 맨 마지막에 첫번째 값을 대입한다.
}
}
==> 이건 for 와 while이 있는 이중 루프이다.
==> start와 i와 j가 어떻게 증가하는지 이해 해야 한다.
==> start는 k 가 2인경우 0, 4, 8, 12 이렇게 증가한다. k가 3인 경우는 0, 6, 12, 18 이렇게 증가한다.
==> i 는 매번 루프를 돌 때무다 start가 대입 되고 while을 돌 때는 1씩 증가한다.
==> j 는 start + k 와 a.length -1 중 작은 값이 대입 되고 while을 돌 때 마다 1씩 증가한다.
return new String(a);
==> 배열 a를 스트링 형으로 바꿔서 return 한다.
}
}
입력값을 위와 같이 바꿔 봤다.
결과 값을 보면 세번째 값인 c가 맨 앞에 왔다. 그 다음 블럭은 ghijkl 이다.
두번째 블럭 세번째 값인 i 가 맨 앞으로 왔다.
세번째 블럭은 mn 이다.
여기서 두번째 값인 n이 앞으로 왔다.
이건 요구 조건 충족이 되는건가?
하여간 Expected 와 결과값이 같으니까 통과 하긴 했는데…
왜 두번째 값인 n이 앞으로 왔는지 모르겠다. 입력값은 3이니까 세번째 값이 와야 되는데… 그런데 세번째 값이 없으니…. 맨 마지막 값이 앞으로 와 버렸다.
로직상 이렇게 작동하는건 맞긴 한데…
이게 요구 조건에 충족되는 건지는 모르겠다.
파이썬 코드는 아래와 같다.
class Solution(object):
def reverseStr(self, s, k):
a = list(s)
for i in xrange(0, len(a), 2*k):
a[i:i+k] = reversed(a[i:i+k])
return "".join(a)
'etc. > Leetcode' 카테고리의 다른 글
Leetcode - 13. Roman to Integer - Easy (0) | 2022.08.08 |
---|---|
Leetcode - 9. Palindrome Number - Easy (0) | 2022.08.06 |
미국 테크니컬 인터뷰 문제 풀이 - Reverse words in a sentence. (0) | 2022.08.03 |
Iterator basic (0) | 2022.07.31 |
Leetcode - 242. Valid Anagram : Easy (0) | 2022.07.31 |
Leetcode - 442. Find All Duplicates in an Array (0) | 2022.07.26 |
JAVA - Find duplicate letters in a String (0) | 2022.07.26 |
JAVA - String Revers Sample (0) | 2022.07.25 |
Leetcode 344 Reverse String - Easy (0) | 2022.07.22 |
Leetcode 118. Pascal's Triangle (Easy) (0) | 2022.07.20 |