💡문제
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);
}
}
요구사항을 분석하여 더욱 간단하게 기능을 구현하였다.
내 코드는 마감기한에 쫓겨 기능구현만 간신히 해낸 것 처럼 부족한 점이 많은 거 같다.
같은 기능을 구현하더라도 더 간결하고, 응용하기 쉽게 구현한 다른 코드만 봐도 그렇다.
어떻게 하면 더 좋은 코드를 구현할 수 있을지 고민이 필요한 시점이다.🤔