[BOJ] 백준 5557번 : 1학년 (JAVA)
문제
상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀고 있다. 예를 들어, "8 3 2 4 8 7 2 4 0 8 8"에서 등식 "8+3-2-4+8-7-2-4-0+8=8"을 만들 수 있다.
상근이는 올바른 등식을 만들려고 한다. 상근이는 아직 학교에서 음수를 배우지 않았고, 20을 넘는 수는 모른다. 따라서, 왼쪽부터 계산할 때, 중간에 나오는 수가 모두 0 이상 20 이하이어야 한다. 예를 들어, "8+3+2-4-8-7+2+4+0+8=8"은 올바른 등식이지만, 8+3+2-4-8-7이 음수이기 때문에, 상근이가 만들 수 없는 등식이다.
숫자가 주어졌을 때, 상근이가 만들 수 있는 올바른 등식의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 숫자의 개수 N이 주어진다. (3 ≤ N ≤ 100) 둘째 줄에는 0 이상 9 이하의 정수 N개가 공백으로 구분해 주어진다.
출력
첫째 줄에 상근이가 만들 수 있는 올바른 등식의 개수를 출력한다. 이 값은 263-1 이하이다.
풀이
다이나믹 프로그래밍을 이용하여 풀 수 있는 문제였습니다.
문제에서 주어진 수를 가지고 연산을 하되, 중간 연산 과정에서 음수가 나와서는 안 되고, 20이 넘어가는 수도 나와서는 안 되는 것이 조건이었습니다.
또한, N - 1개의 수를 연산한 결과를 N번째 수와 비교해서 같은지 비교를 해야했습니다.
위 2가지 조건을 잘 지키면서 메모이제이션을 사용하면 됩니다.
다만, 이 메모이제이션을 사용하기 위해서 배열 2가지를 정의해야합니다.
첫 번째는 문제의 입력값을 받는 operand 배열, 두 번째는 operand 배열에서 특정 수를 연산한 값 sum과, 현재 연산하고 있는 차례 idx를 저장하는 dp 배열이 필요합니다.
전자는 자료형이 int여도 상관없지만, 후자는 자료형이 long이어야 한다는 점을 유의하시길 바랍니다.
그 외에는 전형적인 메모이제이션이므로 자세한 코드는 아래를 참고하시면 되겠습니다.
소스코드
지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 2636번 : 치즈 (JAVA) (0) | 2020.09.08 |
---|---|
[BOJ] 백준 1495번 : 기타리스트 (JAVA) (0) | 2020.09.07 |
[BOJ] 백준 9661번 : 돌 게임 7 (JAVA) (0) | 2020.09.05 |
[BOJ] 백준 9658번 : 돌 게임 4 (JAVA) (0) | 2020.09.05 |
[BOJ] 백준 9657번 : 돌 게임 3 (JAVA) (3) | 2020.09.05 |
댓글