Problem Solving/ruby로 PS 하기

[ruby로 PS 하기] BOJ 21300: Bottle Return

happykoa 2021. 4. 10. 22:02

acmicpc.net/problem/21300

 

21300번: Bottle Return

In the United States, beverage container deposit laws, or so-called bottle bills, are designed to reduce litter and reclaim bottles, cans and other containers for recycling. Ten states currently have some sort of deposit-refund systems in place for differe

www.acmicpc.net

브론즈 5 문제다.

 

솔직히 이 문제 자체는 너무 쉽다. 

그냥 PS를 ruby로 하려고 하다보니 서치를 하게 됐고, 기록삼아 글을 쓰게 되었다.

 

일단, 문제 내용을 쭈욱 읽고 요약하면 아래와 같다.

주어지는 숫자들을 모두 더하고 5를 곱해라

정말 심플하죠? 코드도 최대한 간단하게 짜보려고 했는데

 

먼저 떠오른건 python의 map이다.

 

왜?

 

일단 ruby에서는 입력을 gets로 받아야 하고(다른 방법도 있긴 하지만..) 숫자가 여러개 들어오니까 gets.split으로 나누어 입력을 받아야 한다. 문제는 이렇게 입력을 받으면 숫자가 아니라 문자열로 처리되어 있는 상황이다.

 

따라서, to_i 로 integer 형변환을 해주어야 한다.

 

물론, to_i를 반복문을 이용해 적용할 수도 있지만, 쓸데없이 코드가 길어지는 기분이었고 

python에서의 map 처럼 ruby에서도 map이 있지않을까? 했고, 있었다.

 

www.rubyguides.com/2018/10/ruby-map-method/

 

How to Use The Ruby Map Method (With Examples)

Map is a Ruby method that you can use with Arrays, Hashes & Ranges. The main use for map is to TRANSFORM data. For example: Given an array of strings, you could go over every string & make

www.rubyguides.com

그래서 이런 코드를 짰다.

gets.split.map { |i| i.to_i }

근데, 이것도 뭔가 긴 것 같았다. 그래서 위에 첨부한 글을 더 읽어보니

 

아래와 같이 간결하게 짤 수 있는 방법을 알게 되었다.

ruby의 shorthand로, 요소마다 특정 메서드를 호출하는 방식이라면 &: 를 앞에 붙이고 쓰면 된다.

gets.split.map(&:to_i)

 

입력은 다 받았으니 그럼 이제 모두 더하고 5를 곱하면 끝이다.

puts gets.split.map(&:to_i).sum*5

 

 

+) 어쩌다보니, 숏코딩도 해버렸다.