반응형
https://www.acmicpc.net/problem/1003
틀린 줄 알았는데 맞았다.
접근 아이디어
0의 개수와 1의 개수를 출력해야한다. 피보나치에 dp를 접목시키는 방식은 배열안에 피보나치의 값을 넣어서 값이 있다면 배열을 리턴하는 방식으로 문제를 푼다.
하지만 이 문제는 도통 감이 잡히지 않았다.
막연하게 n만큼 배열을 만들고 n이 가지고 있는 0의 개수와 1의 개수를 리턴하는 식으로 구하면 되지 않을까?? 라고 생각했다. 구현 방식이 깔끔하지 못하고 매번 배열을 리턴하는 방식이 맞는가 싶은 의구심이 들었는데 맞았다.
0과 1은 함수내에서 구현하지 않고 사전에 구현해놓는 편이 코드가 훨씬 더 깔끔할 것 같다.
잘 한 부분
코드가 깔끔하지 못할 것 같기 때문에 결과값을 예측할 수 없어서 타이핑 하지 않으려고 했다. 어차피 틀릴거란 생각.
하지만 다른 방법이 도통 떠오르지 않았고 일단 뭐라도 작성해보자고 해서 작성했고 정답이었다.
부족한 부분
귀찮음과 완벽주의 성향이 있다. 처음부터 깔끔하게 짜야한다는 생각과 주먹구구식으로 짜서 통과되겠어??라는 생각이 이번 문제를 어렵게 만들었다. 코테의 목적은 정답을 맞추는 것이고 두 번째가 효율과 깔끔함인데 우선 정답을 맞추는 코드가 비효율적으로 보이더라도 작성하는 습관을 들여야겠다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class 피보나치함수_1003 {
static int[] dp = {0,0};
static int[][] src;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
int n = Integer.parseInt(br.readLine());
src = new int[n+1][2];
fibonacci(n, src);
System.out.println(src[n][0] + " " + src[n][1]);
}
}
static int[] fibonacci(int n, int[][] src) {
if(src[n][0] != 0 && src[n][1] != 0) {
return src[n];
}
if (n == 0) {
return src[n] = new int[] {1,0};
} else if (n == 1) {
return src[n] = new int[] {0,1};
}
return src[n] = new int[] {fibonacci(n-1, src)[0] + fibonacci(n-2, src)[0], fibonacci(n-1, src)[1] + fibonacci(n-2, src)[1]};
}
}
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스] 혼자 놀기의 달인 자바 (0) | 2022.10.13 |
---|---|
여행경로 자바 (0) | 2022.09.06 |
백준 14889 자바 스타트와 링크 (0) | 2022.03.22 |
백준 14888 자바 연산자 끼워넣기 (0) | 2022.03.22 |
백준 2580 스도쿠 자바 (0) | 2022.03.19 |