YataNox
[Java] 1476 날짜 계산 본문
문제
문제
준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다.
준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다.
각각의 수는 지구, 태양, 그리고 달을 나타낸다.
지구를 나타내는 수를 E,
태양을 나타내는 수를 S,
달을 나타내는 수를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다.
(1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)
우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다.
1년이 지날 때마다, 세 수는 모두 1씩 증가한다.
만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.
예를 들어, 15년은 15 15 15로 나타낼 수 있다.
하지만, 1년이 지나서 16년이 되면 16 16 16이 아니라 1 16 16이 된다.
이유는 1 ≤ E ≤ 15 라서 범위를 넘어가기 때문이다.
E, S, M이 주어졌고, 1년이 준규가 사는 나라에서 1 1 1일때,
준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 수 E, S, M이 주어진다. 문제에 나와있는 범위를 지키는 입력만 주어진다.
출력
첫째 줄에 E S M으로 표시되는 가장 빠른 연도를 출력한다. 1 1 1은 항상 1이기 때문에, 정답이 음수가 나오는 경우는 없다.
요약하자면 각기 다른 최대치를 가진 세 수가 년을 표현하는데 각각 1씩 더해가면서 몇 년인지 출력하는 문제이다.
결국 다 1씩 더해가면서 일일이 비교할 수 밖에 없는 브루트 포스 문제이다.
다른 형태의 년 클래스를 생성해서 해당 클래스의 메소드를 Main에서 실행하는 형태로 구현했다.
문제 풀이
1. 숫자가 3개 적인 문자열을 입력받는다.
2. 년 클래스에 해당 문자열을 생성자 파라미터로 생성한다.
3. 년 클래스에서 각기 숫자를 1씩 더한다.
3-1. 더한 값이 제시된 문자열과 같을 때까지 반복한다.
3-2. 각기 숫자의 최대 값을 넘기게 되면 1로 초기화한다.
4. 결과 년도를 +1해준다.
5. 각각 더한 숫자를 이용해서 결과 문자열을 생성한다.
6. 문자열이 일치하게 되면 해당 문자열을 출력한다.
자바 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
String line = rd.readLine();
// 생성자를 통한 객체 생성, 입력받은 문자열을 생성자 파라미터로 넘겨준다.
AnotherYear anotherYear = new AnotherYear(line);
// 입력받은 문자열과 계산되고 있는 문자열이 일치할 때까지 반복한다.
while(!anotherYear.comparison()){
anotherYear.numUp();
}
// 결과를 출력한다.
System.out.println(anotherYear.getYear());
}
}
class AnotherYear{
StringBuilder sb = new StringBuilder();
// 각 숫자들의 상승 가능한 최대 수치
private final int earthMaxNum = 15;
private final int sumMaxNum = 28;
private final int moonMaxNum = 19;
//각기 다른 세 수
private int earth = 1;
private int sun = 1;
private int moon = 1;
// 계산될 실제 년도
private int year = 1;
// 세 수를 이용하여 만들 비교 문자열
String result = "1 1 1";
// 입력받은 문자열
String inputString;
AnotherYear(String inputString){
this.inputString = inputString;
}
public void numUp(){
// 각 세 숫자를 +1 해준다.
// 각 숫자는 최대 값을 초과하면 1로 초기화
if(++earth > earthMaxNum)
earth = 1;
if(++sun > sumMaxNum)
sun = 1;
if(++moon > moonMaxNum)
moon = 1;
// 실제 년도도 + 1
year++;
// 세 수를 활용해서 바교 문자열 생성
sb.append(earth).append(" ").append(sun).append(" ").append(moon);
result = sb.toString();
sb.setLength(0);
}
// 비교 문자열과 입력 문자열 비교
public boolean comparison(){
return inputString.equals(result);
}
// 년도 출력
public int getYear(){
return year;
}
}
'코딩 테스트 > BAEKJOON' 카테고리의 다른 글
[Java] 18290 NM과 K (0) | 2024.03.28 |
---|---|
[Java] 6064 카잉 달력 (0) | 2024.03.28 |
[Java] 3085 사탕 게임 (2) | 2024.03.28 |
[Java] 골드바흐의 추측 (0) | 2024.03.26 |
[Java] 1929 소수 구하기 (0) | 2024.03.26 |