Problem Solving

[Java] Baekjoon Online Judge 30642: 아이그루스와 화장실

Isaac S. Lee 2023. 11. 12. 02:56
 

30642번: 아이그루스와 화장실

IGRUS는 Inha Group of Research for Unix Security의 약자로, 2000년부터 시작된 정통처 산하 컴퓨터 학술 자치회이다. IGRUS의 동아리방은 사실 복층 구조로, 1층부터 N층까지 총 N개의 층이 있다. 홀수 층에는

www.acmicpc.net

💡문제


IGRUS는 Inha Group of Research for Unix Security의 약자로, 2000년부터 시작된 정통처 산하 컴퓨터 학술 자치회이다. IGRUS의 동아리방은 사실 복층 구조로, 1층부터 N층까지 총 N개의 층이 있다. 홀수 층에는 몸집이 큰 동물을 위한 화장실이, 짝수 층에는 몸집이 작은 동물을 위한 화장실이 있다.

인하대학교의 마스코트 안뇽이는 용이고 인덕이는 오리다. 용은 몸집이 큰 동물이며, 오리는 몸집이 작은 동물이라고 하자. IGRUS 동방에 방문한 안뇽이와 인덕이를 위해 “(<안뇽이> or <인덕이>) 가 <K>층에 있을 때, 자신의 몸집에 맞는 가장 가까운 화장실은 몇 층일까?” 라는 질문에 답하는 프로그램을 만들어보자.

 

✏️입력


첫째 줄에 IGRUS 동아리방의 층수 N이 주어진다.
둘째 줄에 화장실을 이용하려는 마스코트가 안뇽이라면 annyong이, 인덕이라면 induck이 주어진다.
셋째 줄에 해당 마스코트가 현재 있는 층 K가 주어진다.

 

📑출력


문제의 정답이 될 수 있는 정수를 하나 출력한다.
그런 정수가 여러가지라면 그 중 어떤 것을 출력해도 정답으로 인정된다.

 

⏳제한


  • 2 ≤ N ≤ 20,000
  • 1 ≤ K ≤ N

 

예제입력 1

5
annyong
4

 

예제출력 1

5

안뇽이는 용이며, 용은 몸집이 큰 동물이므로 홀수 층의 화장실을 사용해야 한다.
4층에서 제일 가까운 홀수 층의 화장실은 3층과 5층이며, 따라서 정답이 될 수 있는 정수는 3과 5 두 가지이다.
예시 출력의 5 대신 3을 출력해도 정답으로 인정된다.

 

예제입력 2

20
induck
8

 

예제출력 2

8

인덕이는 오리이며, 오리는 몸집이 작은 동물이므로 짝수 층의 화장실을 사용해야 한다.
8층에서 제일 가까운 짝수 층의 화장실은 바로 8층이다.
따라서 8을 출력해야 정답으로 인정된다.

 

🔎알고리즘 분류


  • 수학
  • 구현
  • 사칙연산

 

📌풀이


코드 1

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int N = scan.nextInt(); // 동아리방의 층수
		String mascot = scan.next(); // 마스코트의 이름
		int K = scan.nextInt(); // 마스코트가 현재 있는 층

		if (N < 2 || N > 20_000 || K < 1 || K > N) {
			System.out.println("잘못된 입력");
			return;
		}

		// 마스코트의 몸집에 따른 화장실의 층 출력
		int result = findRestroom(N, K, mascot);
		System.out.println(result);
	}

	// 가장 가까운 화장실을 찾는 메서드
	private static int findRestroom(int N, int K, String mascot) {
		int restroom;

		if (mascot.equals("annyong")) {
			restroom = (K % 2 == 0) ? K - 1 : K; // K가 홀수이면 K, 짝수이면 K - 1
		} else {
			restroom = (K % 2 == 0) ? K : K + 1; // K가 홀수이면 K + 1, 짝수이면 K
		}

		// 층이 N을 초과하지 않도록 함
		if (restroom > N) {
			restroom = (N % 2 == 0) ? N : N - 1;
		}

		return restroom;
	}
}

 

코드 2

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        char f = br.readLine().charAt(0);
        int K = Integer.parseInt(br.readLine());

        int result = (f == 'a' && K % 2 == 1 || f == 'i' && K % 2 == 0) ? K : (K + 1 > N) ? K - 1 : K + 1;
        System.out.println(result);
    }
}

BufferedReader와 삼항연산자를 사용하여 짧고 간결한 코드를 작성해 보았다.

 

코드 3

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = sc.next();
        int k = sc.nextInt();

        int result = (s.charAt(0) == 'a') ? ((k % 2 == 1) ? k : (k + 1 <= n) ? k + 1 : k - 1)
                                          : ((k % 2 == 0) ? k : (k + 1 <= n) ? k + 1 : k - 1);

        System.out.println(result);
    }
}

요구사항을 분석하여 더욱 간단하게 기능을 구현하였다.

 

내 코드는 마감기한에 쫓겨 기능구현만 간신히 해낸 것 처럼 부족한 점이 많은 거 같다.

같은 기능을 구현하더라도 더 간결하고, 응용하기 쉽게 구현한 다른 코드만 봐도 그렇다.

어떻게 하면 더 좋은 코드를 구현할 수 있을지 고민이 필요한 시점이다.🤔