[단계별로 풀어보기] 10813번 공 바꾸기 (1차원 배열)

Jun_Gyu·2023년 3월 5일
0

BackJoon Online Judge

목록 보기
6/18

이번 문제는 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 밑으로 내려갈줄 알았는데 오히려 시간이 조금 더 걸렸다.
아마도 새로운 변수를 지정하여 문제를 풀다보니 실행 속도가 조금 차이가 난 듯 하였다.

앞으로는 좀 더 유연하게 문제를 푸는 자세를 가져야 할 것 같다..!
현재로써는 풀이를 참고하지 않아도 혼자서 풀 수 있는 정도까지는 올라왔지만, 아직 문제를 이해하고 해결하는데 있어서 속도가 많이 느리다.

매일 꾸준히 반복하여 말랑말랑한 사고를 가진 개발자가 되도록 노력하자ㅎㅎ


profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글