2024.07.11기준 - 브론즈3
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 두부게임을 진행할 때, 준서가 걸리지 않기 위해 다음 차례인 사람의 번호를 출력해주는 문제입니다.
이 문제에 접근할 때, 문제가 이해가 잘 되지 않아 조금 애먹은 문제였습니다!..
1. 우선 전체 인원이 1과 2, 3이상의 조건들로 나눠줬습니다.
2. 전체 인원이 1이 들어 온다면 무슨 수를 외치던 본인 밖에 없기 때문에 그대로 출력을 해줍니다.
if (n == 1) { // 전체 인원이 1명이라면
next = 1;
}
3. 전체 인원이 2라면 2명 밖에 없기 때문에 현재 차례의 사람이 3의 수를 가지므로서 무조건 홀수라면 현재 사람이 아니라면 다른 사람이 출력되게 해줍니다.
//예제
2 1 0
(부른 두부의 수)의 2를 나누었을 때, 홀수라면 1, 아니라면 2가 나오게 됩니다.
if (n == 2) { // 전체 인원이 2명이라면
if (k % 2 == 0) {
next = m == 1 ? 2 : 1;
} else {
next = m == 1 ? 1 : 2;
}
}
4. 전체 인원이 3명 이상이라면 예제를 통해 설명을 하도록 하겠습니다.
// 예제
6 1 -1
3명 이상이라면 배열을 생성해 배열 인덱스를 모 수로 값을 사람 번호로 지정을 해 주었습니다.
// 두부의 모 기준으로 사람의 번호를 value로 채워줬습니다.
int[] arr = new int[n + 1];
그림으로 표현을 하자면 현재 상태는 이렇게 나오게 됩니다.
arr[3]은 입력 받은 값 1이기 때문에, arr[1], arr[2]는 바로 계산을 해주었습니다.
// 왼쪽으로 갈 수록 사람의 번호가 작아집니다.
arr[1] = m - 2 > 0 ? m - 2 : m - 2 + n;
arr[2] = m - 1 > 0 ? m - 1 : m - 1 + n;
arr[3] = m;
그 이 후 더 높은 인덱스 값들은 반복문을 통해 입력을 주도록 했습니다.
// 오른쪽으로 갈 수록 사람의 번호가 커집니다.
for (int i = 4; i <= n; i++) {
arr[i] = arr[i - 1] + 1 > n ? arr[i - 1] + 1 - n : arr[i - 1] + 1;
}
부른 두부의 모가 음수일 때는 (부른 두부의 모) % (현재 인원) + (현재 인원)을 하게 되면 해당 모가 출력됩니다.
if (k < 0) { // 부른 두부의 모가 음수 일 때,
next = arr[k % n + n];
}
부른 두부의 모가 음수가 아닐 때는 (부른 두부의 모) % (현재 인원)이 0이라면 (현재 인원)을 아니라면 계산 값을 출력합니다.
else { // 짝수 일 떄
next = arr[k % n == 0 ? n : k % n];
}
코드
package Main;
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 k = Integer.parseInt(st.nextToken()); // 부른 두부의 모 수
int next = 0;
if (n >= 3) { // 전체 인원이 3명 이상이라면
// 두부의 모 기준으로 사람의 번호를 value로 채워줬습니다.
int[] arr = new int[n + 1];
// 왼쪽으로 갈 수록 사람의 번호가 작아집니다.
arr[1] = m - 2 > 0 ? m - 2 : m - 2 + n;
arr[2] = m - 1 > 0 ? m - 1 : m - 1 + n;
arr[3] = m;
// 오른쪽으로 갈 수록 사람의 번호가 커집니다.
for (int i = 4; i <= n; i++) {
arr[i] = arr[i - 1] + 1 > n ? arr[i - 1] + 1 - n : arr[i - 1] + 1;
}
if (k < 0) { // 부른 두부의 모가 음수 일 때,
next = arr[k % n + n];
} else { // 짝수 일 떄
next = arr[k % n == 0 ? n : k % n];
}
} else if (n == 1) { // 전체 인원이 1명이라면
next = 1;
} else if (n == 2) { // 전체 인원이 2명이라면
if (k % 2 == 0) {
next = m == 1 ? 2 : 1;
} else {
next = m == 1 ? 1 : 2;
}
}
bw.write(Integer.toString(next));
bw.flush();
bw.close();
br.close();
}
}
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 21964번 선린인터넷고등학교 교가 (0) | 2024.07.12 |
---|---|
BAEKJOON / 백준 - JAVA 31923번 마라탕후루 (0) | 2024.07.11 |
BAEKJOON / 백준 - JAVA 31922번 이 대회는 이제 제 겁니다 (0) | 2024.07.10 |
BEAKJOON / 백준 - JAVA 31429번 SUAPC 2023 Summer (0) | 2024.07.10 |
BAEKJOON / 백준 - JAVA 2153번 소수 단어 (0) | 2024.07.09 |