https://www.acmicpc.net/problem/2057

 

2057번: 팩토리얼 분해

음 아닌 정수 N이 주어졌을 때, 이 수를 서로 다른 정수 M(M ≥ 1)개의 팩토리얼의 합으로 나타낼 수 있는지 알아내는 프로그램을 작성하시오. 예를 들어 2=0!+1!로 나타낼 수 있지만, 5는 이와 같은

www.acmicpc.net

 

[레벨]

- Silver 5

 

[알고리즘]

- 부르트 포스

- 수학

 

[정답 코드]

import java.io.*;
import java.util.*;

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

        long N = Long.parseLong(br.readLine());
        long[] arr = new long[21];
        if (N == 0) {
            System.out.println("NO");
            return;
        }

        arr[0] = 1L;
        for (int i = 1; i <= 20; i++) {
            arr[i] = arr[i-1] * i;
        }

        for (int i = 20; i >= 0; i--) {
            if (N >= arr[i]) {
                N -= arr[i];
            }
        }

        if (N == 0) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }
}

 

[풀이]

N의 범위가 20! 까지이기 때문에 전체적으로 long 으로 초기화해준다.

N이 0일 경우 바로 NO를 출력해준다.

 

1. N을 20! 부터 0!까지 차례로 빼본다.

2. N >= arr[i]일 경우 N-=arr[i]을 한다.

3. 반복 후 N이 0일 경우 YES 아닐경우 NO를 출력한다.

 

'코딩테스트' 카테고리의 다른 글

백준 7568: 덩치[JAVA]  (0) 2024.04.12
백준 1018: 체스판 다시 칠하기[JAVA]  (0) 2024.04.11
백준 1476: 날짜 계산[JAVA]  (0) 2024.04.09
백준 1543: 문서 검색[JAVA]  (0) 2024.04.09
백준 1436: 영화감독 숌[JAVA]  (0) 2024.04.09

https://www.acmicpc.net/problem/1476

 

1476번: 날짜 계산

준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다. 지구를 나타

www.acmicpc.net

 

 

[난이도]

- Silver 5

 

[알고리즘]

- 부르트 포스

- 수학

 

[정답 코드]

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int E = Integer.parseInt(st.nextToken());
        int S = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int e = 1, s = 1, m = 1;
        int answer = 1;

        while (true) {
            if (e == E && s == S && m == M) {
                break;
            }
            answer++;
            e++;
            if (e > 15) {
                e=1;
            }
            s++;
            if (s > 28) {
                s=1;
            }
            m++;
            if (m > 19) {
                m=1;
            }
        }
        System.out.println(answer);

    }
}

 

[풀이]

1. e = 1, s = 1, m = 1로 초기화 해준다.

2. e++, s++, m++을 하면서 e==E, s==S, m==M이 될때 까지 반복한다.

3. e는 15를 넘어갈 경우 1로 돌아온다. s는 28을 넘어갈 경우 1로 돌아온다. m은 19를 넘어갈 경우 1로 돌아온다.

4. answer를 반환한다.

 

좀더 수학적으로 스마트하게 풀 수 있는 방법이 있을것 같은데 내 머리로는 불가능 했다.

https://www.acmicpc.net/problem/1543

 

1543번: 문서 검색

세준이는 영어로만 이루어진 어떤 문서를 검색하는 함수를 만들려고 한다. 이 함수는 어떤 단어가 총 몇 번 등장하는지 세려고 한다. 그러나, 세준이의 함수는 중복되어 세는 것은 빼고 세야 한

www.acmicpc.net

 

[난이도]

- Silver 5

 

[알고리즘]

- 부르트 포스

- 문자열

 

[정답 코드]

import java.io.*;
import java.util.*;

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

        String words = br.readLine();
        String searchWord = br.readLine();
        int answer = 0;

        while (words.contains(searchWord)) {
            words = words.replaceFirst(searchWord, "_");
            answer++;
        }
        System.out.println(answer);

    }
}

 

[풀이]

1. 문서속에 검색하고 싶은 단어가 포함되면 while문 반복

2. 문서속에 검색하고 싶은 단어를 임의로 "_"로 변경 (String.replaceFirst() 메서드를 활용)

3. 변경했다면 answer 1증가

4. answer 출력

'코딩테스트' 카테고리의 다른 글

백준 2057: 팩토리얼 분해[JAVA]  (0) 2024.04.10
백준 1476: 날짜 계산[JAVA]  (0) 2024.04.09
백준 1436: 영화감독 숌[JAVA]  (0) 2024.04.09
백준 1251: 단어 나누기[JAVA]  (0) 2024.04.09
백준 4179: 불![JAVA]  (0) 2024.04.04

@Override 애너테이션은 메서드가 부모 클래스나 인터페이스의 메서드를 재정의하고 있는지를 컴파일러에게 알려주는 역할을 한다. 이를 통해 재정의한 메서드의 오타나 잘못된 시그니처 등을 빠르게 찾을 수 있습니다.

 

상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 애너테이션을 달아주자.

@Override 애너테이션을 코드를 깔끔하게 보기위해 생략하지 말고 모두 달아주자.

 

 

핵심 정리 : 재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면 여러분이 실수했을 때 컴파일러가 바로 알려줄 것이다. 예외는 한 가지 뿐이다. 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우엔 이 애너테이션을 달지 않아도 된다(단다고 해서 해로울 것도 없다).

명명 패턴 : 변수, 메서드, 클래스 등의 이름을 일정한 패턴에 따라 지정하는 방법. 이는 주로 코드의 가독성을 높이고 일관성을 유지하기 위해 사용된다.

예를 들어, 다음과 같은 명명 패턴이 있을 수 있습니다:

  1. 변수 이름에는 camelCase를 사용: myVariable, totalAmount, userName 등
  2. 메서드 이름에는 동사로 시작하여 동작을 나타냄: calculateTotal(), getUserInfo(), sendMessage()
  3. 클래스 이름은 대문자로 시작하는 CamelCase를 사용: MyClass, UserInfo, HttpRequest 등

 

import java.lang.annotation.*;

// 애너테이션 정의
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Test {
    // 기본값을 설정하여 필수적으로 값을 지정할 필요가 없도록 함
    String value() default "";
}

public class MyClass {
    // 애너테이션을 사용하여 테스트 메서드로 지정
    @Test("This is a test method")
    public void testMethod() {
        // 테스트 로직
    }

    // 테스트 메서드가 아닌 경우
    public void normalMethod() {
        // 일반 메서드 로직
    }

    // 애너테이션이 없는 경우
    public void anotherMethod() {
        // 다른 메서드 로직
    }
}

 

핵심 정리 : 애너테이션으로 할 수 있는 일을 명명 패턴으로 처리할 이유는 없다.

+ Recent posts