PS/백준

[BOJ] 백준 5557번 : 1학년 (JAVA)

제이온 (Jayon) 2020. 9. 6.

문제

상근이가 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이어야 한다는 점을 유의하시길 바랍니다.

그 외에는 전형적인 메모이제이션이므로 자세한 코드는 아래를 참고하시면 되겠습니다.

 

 

소스코드

 

지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.

댓글

추천 글