백준 - 20361번(일우는 야바위꾼)

최지홍·2022년 2월 14일
0

백준

목록 보기
54/145

문제 출처: https://www.acmicpc.net/problem/20361


문제

  • 전설의 야바위꾼 일우는 Shell Game으로 야바위를 한다. Shell Game은 다음과 같은 절차로 진행된다.

  • 진행자가 N개의 컵을 일렬로 놓고, 그 중 X번째 컵에 공을 숨겨둔다.
    임의의 서로 다른 두 컵의 위치를 맞바꾼다. 이 항목을 K번 수행한다. 만약, 공을 숨겨둔 컵을 움직인다면 공도 그 컵을 따라서 움직인다.

  • 참가자는 몇 번째 컵에 공이 숨겨져 있는지 추측한다.

  • 그 컵에 공이 숨겨져 있다면 참가자가, 그렇지 않다면 진행자가 이긴다.

  • 수혁이는 Shell Game을 잘하고 싶다. 하지만, 일우가 진행자라면 무슨 수를 써도 이길 수 없어 수혁이는 일우의 사기도박을 의심하고 있다. 현재 우리는 수혁과 일우가 진행한 Shell Game의 모든 기록을 입수했다. 이를 바탕으로, 일우가 사기도박을 하지 않았다면 공이 몇 번째 컵에 있는지 알려주는 프로그램을 작성하자.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception {
        // 입력을 얻기 위한 reader
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // 종이컵의 수, 간식 위치, 바꾸는 횟수를 얻기 위한 StringTokenizer
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
        int N = Integer.parseInt(tokenizer.nextToken()); // 종이컵의 수
        int X = Integer.parseInt(tokenizer.nextToken()); // 간식 위치
        int K = Integer.parseInt(tokenizer.nextToken()); // 위치를 바꾼 횟수

        int[] paperCup = new int[N]; // 종이컵 정보 배열
        for (int i = 0; i < paperCup.length; i++) {
            paperCup[i] = i + 1; // 1부터 N까지 수를 채워넣는다.
        }

        // K개의 줄에서 바꾼 두 컵의 위치를 받아온다.
        for (int i = 0; i < K; i++) {
            tokenizer = new StringTokenizer(reader.readLine()); // StringTokenizer 설정
            int from = Integer.parseInt(tokenizer.nextToken()) - 1; // 시작(0-인덱스이므로 -1)
            int to = Integer.parseInt(tokenizer.nextToken()) - 1;	// 시작(0-인덱스이므로 -1)
            swap(paperCup, from, to); // 두 컵의 위치 교환
        }

        for (int i = 0; i < paperCup.length; i++) {
            if (paperCup[i] == X) { // 간식을 찾을 경우(1부터 N까지 처음에 넣었으므로 X를 찾으면 된다.)
                System.out.println(i + 1);
                break;
            }
        }
    }

    // 배열의 두 원소를 교환하는 메서드
    private static void swap(int[] target, int from, int to) {
        int temp = target[from]; 	// from 인덱스의 값 저장
        target[from] = target[to];	// to 인덱스의 값을 from 인덱스에 저장
        target[to] = temp;			// to 인덱스에 미리 저장해둔 temp 저장
    }

}

  • swap 함수 구현을 통해 간단히 풀 수 있었다.
  • 그러나 실행 시간이 많이 나오므로 최적화가 필요할 것 같다.
profile
백엔드 개발자가 되자!

0개의 댓글