본문 바로가기

코딩 테스트/BAEKJOON

[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