문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
ascii[a-z] 범위에 있는 문자의 정사각형 격자가 주어질때, 각 행을 알파벳 순으로 재정렬해라. 열이 위에서 아래로 알파벳 순서로 되어 있는지 결정해라. 맞다면 YES, 틀리면 NO를 반환해라.
grid = ['abc', 'ade', 'efg']
격자는 아래와 같이 보여진다.
a b c
a d e
e f g
행은 이미 알파벳 순으로 정렬되어 있다. 열은 a a e, b d f, c e g는 알파벳순으로 되어 있어서 YES를 반환한다. 동일한 행 내의 요소만 재배열 할 수 있다. 다른 행으로 움직이는 것은 할 수 없다.
gridChallenge 함수를 완성해라.
gridChallenge 함수는 아래와 같은 매개변수를 가지고 있다.
각 문자열은 ascii[a-z] 범위 안에 있는 소문자이다.
List의 각 요소를 정렬한 후 String으로 변경하여 문제를 해결했다. 이때 문자열을 오름차순으로 정렬하는 메소드를 만들어 진행했다.
public static String stringSort(String s){
char[] charArr = s.toCharArray();
Arrays.sort(charArr);
return new String(charArr);
}
먼저 StringBuilder sb를 생성한다. String을 사용하면 테스트 케이스에서 오류가 발생할까봐 StringBuilder를 사용했다. 그리고 반복문을 통해 주어진 grid의 요소를 알파벳순으로 정렬하고 sb에 넣어준다.
StringBuilder sb = new StringBuilder();
for(int i = 0; i < grid.size(); i++){
sb.append(stringSort(gird.get(i)));
}
String s를 선언하고 sb를 String으로 할당한다. while문을 사용하기 때문에 인덱스를 정하기 위한 정수 start를 선언하고 0을 할당한다. while문의 조건은 start가 s의 길이에서 grid의 길이를 뺀만큼 반복한다. 왜냐하면 start를 증가시키다보면 grid의 마지막 요소 내에서 비교하는 것을 막기 위해서이다.
String s = sb.toString();
int start = 0;
while(start < s.length() - grid.size()){
}
이제 while문 안에 if문을 통해서 각 열이 오름차순으로 되어 있는지 확인한다. 다음 열을 가져오는 방법은 해당 인덱스에 grid의 길이를 더하면 된다. 이때 현재 인덱스의 문자가 비교하는 인덱스의 문자보다 뒤의 문자면 NO를 반환하고, 그렇지 않으면 현재 인덱스를 증가시킨다.
while(start < s.length() - grid.size()){
if(s.charAt(start) > s.charAt(start + grid.size())){
return "NO";
}
start++;
}
while문을 빠져나왔다면 모든 열이 오름차순으로 정렬되어 있기 때문에 YES를 반환한다.
return "YES";
public static String gridChallenge(List<String> grid) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < grid.size(); i++){
sb.append(stringSort(grid.get(i)));
}
String s = sb.toString();
int start = 0;
while(start < s.length() - grid.size()){
if(s.charAt(start) > s.charAt(start + grid.size())){
return "NO";
}
start++;
}
return "YES";
}
public static String stringSort(String s){
char[] charArr = s.toCharArray();
Arrays.sort(charArr);
return new String(charArr);
}