근데 나는 s를 split해서 arr에 넣을때 "" 값이 들어가 있었기 때문에, 위의 방법으로 answer의 크기를 미리 지정해주려면 split 코드를 약간 수정해서 넣어야 할 것 같다.
+) 정렬 코드도 이런식으로 개선 할 수 있다.
Arrays.sort(arr, new Comparator<String>(){
public int compare(String s1, String s2){
return s1.length()-s2.length();
}
});
//위의 코드를 아래처럼 수정 가능
Arrays.sort(arr, (s1, s2)->{return s1.length()-s2.length();});
>전체 코드
import java.util.*;
class Solution {
public int[] solution(String s) {
int idx=0;
int[] answer = {};
LinkedList<Integer> list= new LinkedList<>();
String[] arr= s.split("\\{|\\},\\{|\\}");
Arrays.sort(arr, new Comparator<String>(){
public int compare(String s1, String s2){
return s1.length()-s2.length();
}
});
for(int i=0; i<arr.length; i++){
if(arr[i].equals("")) continue;
String[] tuple= arr[i].split(",");
for(int j=0; j<tuple.length; j++){
if(!list.contains(Integer.parseInt(tuple[j])))
list.add(Integer.parseInt(tuple[j]));
}
}
answer= new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i]= list.get(i);
}
return answer;
}
}
△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.
이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.
[제한사항]
N : 21 이상 220 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.)
A, B : N 이하인 자연수 (단, A ≠ B 입니다.)
[입출력 예]
N
A
B
answer
8
4
7
3
입출력 예 설명
입출력 예 #1
첫 번째 라운드에서 4번 참가자는 3번 참가자와 붙게 되고, 7번 참가자는 8번 참가자와 붙게 됩니다. 항상 이긴다고 가정했으므로 4번 참가자는 다음 라운드에서 2번이 되고, 7번 참가자는 4번이 됩니다. 두 번째 라운드에서 2번은 1번과 붙게 되고, 4번은 3번과 붙게 됩니다. 항상 이긴다고 가정했으므로 2번은 다음 라운드에서 1번이 되고, 4번은 2번이 됩니다. 세 번째 라운드에서 1번과 2번으로 두 참가자가 붙게 되므로 3을 return 하면 됩니다.
>문제 풀이
level 2 중에도 쉬운 문제 였습니다.
문제에 a, b는 N이하의 자연수라고만 적혀있어서 Math.min, Math.max로 순서 정리를 해주고
한 step 씩 올라가는 과정을 cnt++로 카운트 해주면 됩니다.
홀수 일때 ex) b=7이면 8이랑 붙어서 올라가게 되며 다음 단계에서 index 4가 됩니다.
즉, a, b가 홀수일 경우 (a+1)/2가 다음 단계의 index가 됩니다.
짝수일 경우에는 a/2를 넘겨주면 됩니다.
이것만 알면 풀 수 있는 문제였습니다.
>전체 코드
class Solution
{
public int solution(int n, int a, int b)
{
return round(Math.min(a, b), Math.max(a, b));
}
public int round(int a, int b){
int cnt=1;
while(true){
if (b%2==0 && a+1==b) break;
if(a%2!=0) a+=1;
if(b%2!=0) b+=1;
a/=2;
b/=2;
cnt++;
}
return cnt;
}
}
rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
다음은 6 x 6 크기 행렬의 예시입니다.
이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.
행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
[제한사항]
rows는 2 이상 100 이하인 자연수입니다.
columns는 2 이상 100 이하인 자연수입니다.
처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.