이번 문제는 10810번 공넣기 문제에서 변형되어 나온 문제로, 이번에는 각 자리의 숫자가 서로 바뀌게끔 코드를 구성하려고 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer str = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(str.nextToken());
int[] A = new int[N];
for (int I = 0; I < N; I++) {
A[I] = I + 1;
}
int M = Integer.parseInt(str.nextToken());
for (int I = 0; I < M; I++) { // 0부터 M까지 반복
str = new StringTokenizer(br.readLine(), " ");
int i = Integer.parseInt(str.nextToken());
int j = Integer.parseInt(str.nextToken());
if (A[i - 1] > A[j - 1]) {
int num = A[i - 1] - A[j - 1];
A[i - 1] = A[j - 1];
A[j - 1] = A[j - 1] + num;
}
else {
int num = A[j - 1] - A[i - 1];
A[i - 1] = A[j - 1];
A[j - 1] = A[j - 1] - num;
}
}
for (int I = 0; I < N; I++) {
System.out.print(A[I] + " ");
}
}
}
이번에는 수열의 값이 처음부터 1~N 까지 순차적으로 주어진 상태에서 시작하며, 두번째줄부터 입력하는 숫자의 위치값들이 서로 자리를 바꾸게 되는 방식이다.
처음에 수학적으로 접근하다보니 굉장히 코드가 길어졌는데, 원리는 간단하다.
예를들어 [1, 5] 의 두자리 행렬이 있다고 가정한다면, 첫번째 자리에 큰 수인 5를 대입하고,
두번째자리에 5 - 1을 하여 나온 4에서 작은수인 1을 더한 값 5를 다시 두번째 자리에 넣는 방식으로 문제를 해결하였다.
사실 처음에 어떤 방식으로 문제를 해결할지 10분넘게 고민을 하다가 문제를 해결하였다...
첫번째 시도의 흔적. 코드 실행 시간은 148ms이다.
다른사람들이 풀이를 한 것을 보니 내가 너무 어렵게 접근을 한 것 같았다..
아래 코드는 다른사람들의 풀이를 참고하여 문제를 해결한 방법이다.
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer str = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(str.nextToken());
int[] A = new int[N];
for (int I = 0; I < N; I++) {
A[I] = I + 1;
}
int M = Integer.parseInt(str.nextToken());
for (int I = 0; I < M; I++) { // 0부터 M까지 반복
str = new StringTokenizer(br.readLine(), " ");
int i = Integer.parseInt(str.nextToken());
int j = Integer.parseInt(str.nextToken());
int k = A[i-1];
int l = A[j-1];
A[j-1] = k;
A[i-1] = l;
}
for (int I = 0; I < N; I++) {
System.out.print(A[I] + " ");
}
}
}
그냥 단순하게 각각의 자리 숫자를 새로운 변수로 저장하여 서로의 자리에 대입만 해주면 되는것을.. 너무 어렵게 생각해버렸다 ㅠㅠ
그래서 몇초가 걸렸을까?
코드가 더 짧아졌길래 나는 100ms 밑으로 내려갈줄 알았는데 오히려 시간이 조금 더 걸렸다.
아마도 새로운 변수를 지정하여 문제를 풀다보니 실행 속도가 조금 차이가 난 듯 하였다.
앞으로는 좀 더 유연하게 문제를 푸는 자세를 가져야 할 것 같다..!
현재로써는 풀이를 참고하지 않아도 혼자서 풀 수 있는 정도까지는 올라왔지만, 아직 문제를 이해하고 해결하는데 있어서 속도가 많이 느리다.
매일 꾸준히 반복하여 말랑말랑한 사고를 가진 개발자가 되도록 노력하자ㅎㅎ