https://leetcode.com/problems/shuffle-string/
<문제>
You are given a string s
and an integer array indices
of the same length. The string s
will be shuffled such that the character at the ith
position moves to indices[i]
in the shuffled string. Return the shuffled string.
<문제해설>
문자열 s, 숫자배열 indices가 주어진다.
indices에 주어진 index에 맞게 s를 재배열하라.
<풀이>
class Solution {
public String restoreString(String s, int[] indices) {
// 배열 or list?
// map??
char[] arr = new char[s.length()];
// List list = new ArrayList();
for (int i = 0; i < indices.length; i++) {
int num = indices[i];//4
arr[num] = s.charAt(i);
// list.set(num, s.charAt(i));
}
String answer = "";
for(char c : arr){
answer += c;
}
return answer;
// return Arrays.toString(arr); //"[l, e, e, t, c, o, d, e]"...
// return String.join(",",list);
}
}
<접근방식>
어떤 식으로 접근해야 할까?
처음에는 key-value를 구조의 map을 고려했었다. ‘key에는 인덱스를, value에는 문자를 넣고 key를 기준으로 오름차순 정렬하면 되지 않을까?’
그런데 map 사용에 익숙하지 않아서 빠른 포기..
⭐️ 임의의 자료구조를 만들고 indices에 있는 인덱스 순서대로 문자열을 넣어주면 되겠다는 생각이 들었다.
ex) indices[0] = 4, 자료구조[4] = 문자열0번째값
indices[i] = n, 자료구조[n] = 문자열i번째값
어떤 자료구조를 사용해야 할까? (feat. List를 사용하려다가 포기한 이유)
List list = new ArrayList();
list.set(num, s.charAt(i)); // IndexOutOfBoundsException
IndexOutOfBoundsException 발생!
List는 배열과 달리 어떤 인덱스든 자유롭게 접근 가능한 거 아니었나?? 😤
👉 list는 empty고 size()=0이야. n번째 인덱스에 접근(데이터를 넣거나, 가져오거나)하려면 n번째까지 데이터를 가지고 있어야 해!
배열(array) : 선언 시 n개의 공간 확보 → capacity (용량) (데이터 용량 변경 불가능)
n개의 범위 내에서 원하는 인덱스에 자유롭게 접근 가능 → size
리스트(list) : 선언 시 10개의 공간 확보 → capacity (용량) (데이터 용량 변경 가능)
0부터 데이터가 존재하는 인덱스까지 접근 가능 (데이터가 없는 구간을 건너뛰어서 접근할 수 없다) → size
/*
public void add(int index, E element) {
rangeCheckForAdd(index);
//~~
}
*/
//실제로 index가 사이즈보다 크면 예외가 발생한다
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
test.set(5, "test");
is the statement that throws this exception, since your ArrayList
is empty (size()
would return 0
if you got to that statement), and you can't set the i'th element if it doesn't already contain a value. You must add at least 6 elements to your ArrayList
in order for test.set(5, "test");
to be valid.
new ArrayList(10)
doesn't create an ArrayList
whose size is 10. It creates an empty ArrayList
whose initial capacity is 10.
<다른 코드 참고>
class Solution {
public String restoreString(String s, int[] indices) {
int n = indices.length;
char[] result = new char[n];
for (int i = 0; i < n; i++) {
result[indices[i]] = s.charAt(i);
}
return new String(result); //!!
}
}
char[] 배열로 바로 String을 만들어주는 생성자가 있었구나!
<마무리하며>
☁️ 자료구조←>문자열 변환은 언제쯤 능숙하게 할 수 있는걸까? split, join 같은 메소드들이 아직 생소하다..!
size, length도 사용할 때마다 헷갈린다.
🌥️ 자료구조 개념이 부족한 것 같아서 ‘김영한 강사님 -자바 중급2’를 시작했다. 자료구조 마스터가 될거야!
#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL