[백준] 13413 오셀로 재배치 JAVA

·2024년 3월 23일

1일1백준 -Java-

목록 보기
50/60

문제

로봇을 좋아하는 세희는 로봇동아리에서 카메라와 센서, 라즈베리 파이, 집게발을 이용해 로봇을 완성하였다. 이 로봇을 통해서 오셀로 재배치라는 작업을 하려고 한다. 오셀로 말은 앞면이 검정, 뒷면이 흰색으로 된 말이다. 세희의 목표는 로봇을 이용하여 처음 배치된 오셀로 말을 주어진 형태로 바꾸는 일을 하는 것이다. 아래의 예시를 참고하자.

초기 상태
○●●○○
목표 상태
○●○●○
세희는 로봇을 이용해 2가지 작업 중 하나를 골라 진행할 수 있다.

  1. 배치된 말 중 임의의 2개의 말을 골라 서로의 위치를 바꾼다.
  2. 말 1개를 들어 뒤집어 놓아 색상을 변경한다.

위의 예시에서, 3번째와 4번째 말을 2번 작업을 통해 각각 뒤집으면 2번의 작업으로 목표 상태를 만들 수 있다. 하지만 1번 작업을 통해 3번째와 4번째 말을 골라 서로의 위치를 바꾸어주면 1번 만에 목표 상태에 도달할 수 있다. 초기 상태의 말과 목표 상태의 말이 주어질 때, 목표 상태에 도달할 수 있는 최소 횟수를 구하는 프로그램을 작성하시오.

입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 각 입력의 첫 번째 줄에는 오셀로 말의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 각 입력의 두 번째 줄과 세 번째 줄에는 각각 오셀로 말의 초기 상태와 목표 상태가 주어진다. 초기 상태와 목표 상태의 말의 개수는 항상 N과 일치한다. 흰색 면이 보이는 경우에는 W, 검은색 면이 보이는 경우에는 B로 주어진다.

출력

출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 한 줄에 1개씩 초기 상태에서 목표 상태를 만들기 위한 작업의 최소 횟수를 구한다.

예제 입력

3
5
WBBWW
WBWBW
7
BBBBBBB
BWBWBWB
4
WWBB
BBWB

예제 출력

1
3
2

내가 했던 풀이 방법

  1. W-B쌍을 찾아 서로 교환, 쌍이 없을 경우, 값을 바꿈 (W<->B) -> 실패 (런타임 오류 발생)
  2. 위치가 바뀌어야 하는 W와 B의 개수를 각각 계산, 둘 중 더 큰 값 출력 -> 성공
    W-B쌍이 존재할 경우, 1번 행동이 쌍 개수만큼 실행 그 외 쌍이 존재하지 않는 개수만큼 2번 행동이 실행되므로, W, B 개수 중 더 큰 값과 동일

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int cases = Integer.parseInt(br.readLine());

        int N;
        String input1, input2;
        ArrayList<Integer> index = new ArrayList<>();
        ArrayList<Character> current = new ArrayList<>();
        ArrayList<Character> goal = new ArrayList<>();

        for(int i=0; i<cases; i++) {
            current.clear();;
            goal.clear();
            index.clear();

            N = Integer.parseInt(br.readLine());

            input1 = br.readLine();
            input2 = br.readLine();
            for(int j=0; j<N; j++) {
                current.add(input1.charAt(j));
                goal.add(input2.charAt(j));
                if(input1.charAt(j) != input2.charAt(j)) {
                    index.add(j);
                }
            }

            int W = 0;
            int B = 0;
            for(int j=0; j<index.size(); j++) {
                if(current.get(index.get(j))=='W') {
                    W++;
                } else {
                    B++;
                }
            }

            if(W>=B) {
                System.out.println(W);
            } else {
                System.out.println(B);
            }
        }
    }
}

회고

처음 구현한 코드가 코드 자체는 복잡할지라도 나름 잘 구현했다 생각했는데 런타임 오류가 발생해서 속상했다. 물론 코드가 성능자체는 구렸겠지만, 되게 복잡한 코드를 잘 정리했다고 생각했고, 2~30분동안 구현했다보니 완전 갈아엎는 게 조금 아쉬웠지만, 다행히 금방 좋은 방법이 떠올라서 갈아엎어버렸다...ㅎ 이마저도 틀리게 출력되는 반례가 있었는데, 단순한 index 문제였다. 코딩 문제를 풀 때 index가 제일 까다로운 것 같다. 변수가 많아질수록 index가 제일 헷갈리는데 그래도 나름 변수명에 신경을 쓰려고 하고 있지만, 앞으로는 좀 더 변수명에 신경을 써줘야겠다.

profile
Frontend🍓

0개의 댓글