알고리즘 트레이닝/Dynamo로 푸는 백준

Dynamo로 풀어보자-백준 25304번(영수증)

hnanmal 2023. 2. 28. 23:33
300x250

두 가지 소스에서 오는 데이터의 정합성을 판단할 때

프로그램을 만들 때, 하나의 소스를 이리저리 조작해가며 알고리즘을 만들기도 하지만, 두가지 소스에서 파생된 결과를 비교해서 일치 여부를 파악하는 작업이 필요할 때도 있습니다. 이번 백준 문제가 그런 상황에 잘 맞는 예제가 되는 것 같습니다. 사실 풀이 자체는 전혀 복잡하지 않습니다.

문제 및 입력 조건

25304번: 영수증

 

25304번: 영수증

준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것

www.acmicpc.net

 

 

 

다이나모 풀이

풀이 완료된 노드 그래프는 아래와 같습니다.

 

 

 

입력부

 

코드 블럭에 입력된 첫째 값이 영수증 금액이고,

그 아래로 입력된 값들은 장을 본 항목 수,

그리고 각각의 가격과 개수가 있습니다.

데이터를 하나의 리스트로 모아주는 편이 하나 씩 정리하면서 코드 진행을 할 수 있어 편합니다.

 

 

 

입력값 분리 및 가격과 개수 정리

 

Deconstruct 노드를 이용해서 리스트의 첫째값과 나머지를 분리합니다.

그럼 가장 먼저 영수증에 적힌 금액이 분리되죠.

그 다음에 Deconstruct 노드를 한번 더 사용해주면, 산 물건의 가격과 개수가 적힌 문자열들만 남게 됩니다.

 

공백을 기준으로 합쳐져 있으니, 두 개의 문자열로 분리해 줍시다. String.Split 노드는 이제 익숙하시죠?

중첩된 리스트가 결과로 나오고, 하위 리스트 각각에는 가격과 개수가 분리된 항목으로 정리되었습니다.

 

 

데이터 타입 변경 및 항목 별 가격 계산

 

위 그림에서 보이는 20000원 과 5개를 곱해주면 한 장 본 항목 한 가지에 대한 가격이 나오겠죠? 모든 리스트에 이렇게 해주기 위해 List.FirstItem과 List.LastItem 노드를 이용해서 각각을 별개의 리스트로 분리해 줍시다. 그리고 난 다음에 아직은 데이터의 타입이 문자열이라는 것을 잊어버리지 맙시다. String.ToNumber 노드를 이용해서 숫자 타입으로 바꿔줍시다.

 

그런 다음에는 * 노드에 각 리스트를 연결해서 1대1로 곱해줍시다.

결과가 잘 나오는 걸 맨 오른쪽 노드를 보면 알 수 있죠?

 

 

 

총 합 가격 계산 후 영수증 가격이랑 비교하기

 

아까 계산해둔 결과를 Math.Sum노드에 연결하면 모든 물건의 총 합 가격이 나옵니다.

 

코드 블럭에 bill이라는 변수로 저장해둔 값은 아까 맨 처음 Deconstruct노드를 통해 미리 분리해둔 영수증의 가격이고, 이걸 지금 Math.Sum노드로 계산한 값과 비교해보면 됩니다.

 

==노드에 연결하면 당연히 true와 false로 참, 거짓 여부를 확인해 줍니다.

 

 

 

출력 양식 맞춰주기

 

일치하면 Yes, 아니면 No를 출력해주기로 했었죠?

딕셔너리로 미리 true에 Yes, false에 No를 할당해둡시다.

 

그런 다음 아까 비교해서 도출해낸 결과값을 문자열로 바꿔준 다음, 미리 만든 딕셔너리에서 해당하는 값을 가져오라고 노드를 배치하기만 하면 끝납니다.

 

 

예제의 다른 입력 값을 사용해 영수증 금액을 250000원으로 바꾸면, 결과가 No로 출력 되는 것을 확인할 수 있습니다.

 

 

 

결론

데이터를 비교하는 데 쓰이는 노드는 ==로 사실 어려울 것이 없습니다.

가장 신경 써야할 것은 ==노드로 입력 시켜야 할 데이터들은 앞에서 적절한 단계를 거쳐 중첩 리스트, 혹은 단일 리스트로 정리 및 분할이 되어야 한다는 것만 신경 쓰시면, 실전에서도 필요한 만큼의 프로그래밍을 해낼 수 있으실 거라 생각합니다.

반응형