본문 바로가기
백준

[25966] 배찬우는 배열을 좋아해 (JAVA)

by 댈팽이 2024. 3. 14.
728x90

# 문제 설명

찬우는 오늘 프로그래밍 기초 강의에서 2차원 배열에 대해 배웠다. 너무 재미있던 찬우는 2차원 배열에다 연산을 진행하기로 결심했다.

아래와 같은 두 가지 종류의 연산이 쿼리로 주어진다.

  • 0 i j k : 번 행의 번 열의 값을 로 바꾼다.
  • 1 i j : 번 행과 번 행을 swap한다.

swap 이란 번 행의 모든 원소와 번 행의 모든 원소를 바꾸는 연산이다.

개의 쿼리를 수행한 후 바뀐 배열의 최종 결과를 출력하시오.


입력

첫째 줄에 행의 개수 과 열의 개수 , 쿼리의 개수 가 주어진다. (1≤N, M≤3000, 1≤q≤10)

2번째 줄부터 개의 줄에 걸쳐 열의 2차원 배열이 입력으로 주어진다. 배열의 각 원소의 값은  이상 10000 이하의 정수이다.

이후 개 줄에 걸쳐 쿼리가 입력으로 주어진다.

쿼리는 0 i j k 혹은 1 i j의 형태로 주어지며, 쿼리의 첫 번째 값이 0이면 첫 번째 쿼리를, 1이면 두 번째 쿼리를 수행한다.

첫 번째 쿼리의 경우 , , 의 범위는 (0≤i≤N−1, 0≤j≤M−1, 1≤k≤10000)이며 는 정수이다.

두 번째 쿼리의 경우 , 의 범위는 (0≤i, j≤N−1)이다.


출력

개의 쿼리를 전부 수행한 후의 2차원 배열을 출력한다.

 

# 정답 코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken()); //행의 개수
        int M = Integer.parseInt(st.nextToken()); //열의 개수
        int q = Integer.parseInt(st.nextToken()); //쿼리의 개수

        int[][] table = new int[N][M];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());

            for (int j = 0; j < M; j++) {
                table[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for (int query = 0; query < q; query++) {
            st = new StringTokenizer(br.readLine());

            //i번 행의 j번 열의 값을 k로 변경
            if (Integer.parseInt(st.nextToken()) == 0) {
                int i = Integer.parseInt(st.nextToken());
                int j = Integer.parseInt(st.nextToken());
                int k = Integer.parseInt(st.nextToken());

                table[i][j] = k;
            }
            //i번 행과 j번 행을 swap
            else {
                int i = Integer.parseInt(st.nextToken());
                int j = Integer.parseInt(st.nextToken());

                int[] swap = table[i];
                table[i] = table[j];
                table[j] = swap;
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                bw.write(table[i][j] + " ");
            }
            bw.write("\n");
        }

        bw.flush();
        bw.close();
    }
}

 

시간을 줄이기 위해 입력과 출력에 BufferedReader, BufferedWriter를 사용했다.

BufferedReader로 한 줄을 읽고 StringTokenizer를 이용하여 띄어쓰기마다 나누었다.

 

행의 개수가 N, 열의 개수가 M인 2차원 배열 table[N][M]를 만든다.

for문을 통해 table에 값을 저장한다.

 

그다음 q만큼 반복하며 쿼리를 처리한다.

만약 첫번째 숫자가 0이면, i번 행의 j번 열의 값을 k로 변경한다.

첫번째 숫자가 1이면, i번 행과 j번 행을 swap한다.

 

그 후 BufferedWriter에 배열의 값을 적고 출력하였다.

728x90

'백준' 카테고리의 다른 글

[1940] 주몽 (JAVA)  (0) 2024.03.17
[2018] 수들의 합 5 (JAVA)  (1) 2024.03.17
[11660] 구간 합 구하기 5 (JAVA)  (4) 2024.03.14
[11659] 구간 합 구하기 4 (JAVA)  (0) 2024.03.14
[1546] 평균 (JAVA)  (0) 2024.03.13