코테/백준

[백준/JAVA] 2193번: 이친수

imname1am 2023. 5. 15. 17:14
반응형

🔺 문제

 

2193번: 이친수

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않

www.acmicpc.net

 

 

🔺 코드

- 정답 1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.*;
import java.io.*;
 
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());
        long[][] D = new long[N + 1][2];
        D[1][1= 1;    // 길이 1에서 1로  끝나는 이친수 개수
        D[1][0= 0;    // 길이 1에서 0으로 끝나는 이친수 개수
        
        for(int i = 2 ; i <= N ; i++) {
            D[i][0= D[i - 1][0+ D[i - 1][1];
            D[i][1= D[i - 1][0];
        }
        System.out.println(D[N][0+ D[N][1]);
    }
}
cs
✅ 해결 아이디어
✔ DP - 2차원 배열 점화식 활용
- D[i][0] : i 길이에서 끝이 0으로 끝나는 이친수 개수
- D[i][1] : i 길이에서 끝이 1로 끝나는 이친수 개수

 

 

- 정답 2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
import java.io.*;
 
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());
        long[] D = new long[N + 1];
        D[0= 0;
        D[1= 1;
        
        for(int i = 2 ; i <= N ; i++) {
            D[i] = D[i - 1+ D[i - 2];
        }
        System.out.println(D[N]);
    }
}
cs

 

 

💥 유의사항

- DP 배열을 long형으로 선언해야 함.

 ⇨ N이 45보다 큰 경우, int로 계산하면 올바른 결과를 얻지 못할 수 있으므로

      long형으로 선언해 정수 범위를 벗어나지 않도록 해야 함.

 


🔺 다른 풀이들

- 첫째 , 둘째 풀이과정 모두 설명 굿

 

[백준/2193/Java] 이친수

문제링크 www.acmicpc.net/problem/2193 2193번: 이친수 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의

smartpro.tistory.com

 

 

- 두 번째 풀이과정 설명

 

[알고리즘-JAVA] 백준 알고리즘 2193번 - 이친수

접근 과정 1. 어떤 문제로 이해 했는가? 그리고 문제의 제약 조건은? n자리 이친수의 총 개수를 구하는 문제이다. 2. 나의 방식대로 문제를 재정의 하자. d[n] = n자리 이친수의 총 개수라고 하고 dp

odysseyj.tistory.com

 


💬 느낀 점

두 번째 풀이는 직접 손으로 풀어보고 계산하고 규칙 찾아서 점화식 찾았는데

이렇게 뒷자리에서부터 역순으로 0 / 1이 나오는지 경우의 수를 나눠 규칙을 찾는 건지 몰랐다.

 

1회독 2회독 3회독 4회독 5회독
V 7/5      

 

 

(+ 7/3 2회독)

위에 올린 2번째 풀이로 풀었는데

dp 배열을 int형으로 선언해서 틀렸었다ㅠ

그래도 점화식까진 생각해냈으니까 장족의 발전?!🤗

 

암튼 다음부터는 dp 배열 여유있게 long형으로 선언하고 가야겠다~~


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.*;
import java.io.*;
 
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());
        long[] D = new long[N + 1];    // long형으로 해야 함!!!
        D[1= 1;
        
        for(int i = 2 ; i <= N ; i++) {
            D[i] = D[i-1]+D[i-2];
        }
        
        System.out.println(D[N]);
    }
}
 
cs

 

 

(참고)

✔ Do it 알고리즘 코딩테스트 자바편

 

 

반응형