AtCoder로 Ruby 학습 13 2 차원 배열을 만드는 방법

소개



Ruby와 알고리즘 학습의 일환으로 경쟁 프로그래밍에 참여합니다.
여기에서는 학습에서 배운 것을 출력하고 있습니다.

이번에는 2차원 배열을 만드는 방법에 대해.
제 3 회 알고리즘 검정 제 2 질문 다이나믹 스코어링
2차원 배열을 사용하고 싶은 장면이 나왔습니다.
여기서 조금 어색했기 때문에 복습을 위해 정리해 둡니다.

하고 싶은 일



다음과 같은 일을 하고 싶어서 2차원 배열을 만들려고 했습니다.

예를 들어,
한 시험에 3명의 참가자(1,2,3)가 참가한다.
그 시험에서는 3문제의 문제가 출제된다.
참가자마다 각각의 문제에 대답할 수 있었는지 여부를 관리한다.

이미지는 아래와 같은 느낌입니다.

이미지
# ①こんな感じの二次元配列を作っておく
[[0, 0, 0],[0, 0, 0],[0, 0, 0]]

# ②参加者1が1問目に正解したら、該当の要素に1をいれる
[[1, 0, 0],[0, 0, 0],[0, 0, 0]] #第一要素の配列の最初の要素に 1 

# ③次に参加者3が2問目に正解したら、該当の要素に1をいれる
[[1, 0, 0],[0, 0, 0],[0, 1, 0]] #第三要素の配列の2番目の要素に 1 

①처음에 한 일(실수)


ary = Array.new(3, Array.new(3, 0))
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]

외형으로서는 만들고 싶은 것이 되어 있습니다만,
답변 기록을 넣으려고하면
ary[0][0] = 1
print ary
# => [[1, 0, 0],[1, 0, 0],[1, 0, 0]]

첫 번째 요소의 배열에만 변경을 할 생각이 모든 배열에 영향을 미쳤습니다.

②map 메소드를 사용해(정답!)


ary = Array.new(3).map{Array.new(3,0)}
print ary
# => [[0, 0, 0],[0, 0, 0],[0, 0, 0]]

ary[0][0] = 1
print ary
# => [[1, 0, 0],[0, 0, 0],[0, 0, 0]]

결과로서는 map 메소드를 관련시키는 것으로, 무사 이미지대로의 배열을 만들 수 있었습니다.

무엇이 다른지



위의 ①, ②의 2차원 배열은 외형은 완전히 동일하지만, 아무래도 완전히 다른 성질을 갖는 것 같습니다.
무엇이 다른지 생각해 갑니다.

Array 클래스의 new 메소드 ①에 대해서



참조 에는 아래와 같이 쓰여져 있습니다.

new(size = 0, val = nil) -> Array

길이 size 의 배열을 생성해, 각 요소를 val 로 초기화해 돌려줍니다.
각 요소에 대해 val이 복제되지는 않습니다.
모든 요소가 동일한 객체 val을 참조합니다.


ary = Array.new(3, "foo")
p ary                     #=> ["foo", "foo", "foo"]
ary[0].capitalize!
p ary                     #=> ["Foo", "Foo", "Foo"]

이 예에서는 각 요소의 "foo"가 모두 동일한 객체임을 보여줍니다.
설명문대로 모든 요소가 같은 객체 val 가 된다고 하는 것입니다.

그렇다면 ①에서 만든 2차원 배열은 다음과 같은 이미지일까요?



배열 안에서는 요소가 3개로 나뉘어져 있는 것처럼 보이더라도, 결국은 같은 하나의 객체를 참조하고 있을 뿐.
어떤 요소를 변경하겠지만, 변경되는 것은 같은 객체라는 것 같습니다.



이런 이미지일까요?

map 메소드 ②에 대해



참조 에는 아래와 같이 쓰여져 있습니다.

map -> Enumerator
map {|item| ... } -> [object]

각 요소에 대해 블록을 평가한 결과를 모두 포함한 배열을 돌려줍니다.
블록을 생략하면 위에서 설명한 반복을 수행하고,
그 결과 얻어지는 배열을 돌려주는 Enumerator 객체를 돌려줍니다.


# すべて 3 倍にする
p [1, 2, 3].map {|n| n * 3 }  # => [3, 6, 9]

map 메소드는, each 메소드와 같이 배열 오브젝트로부터 요소를 하나씩 꺼내,
블록 {} 내의 처리를 행한 결과를 배열로서 돌려줍니다.

그렇다고 하는 것은, ②로 만든 2차원 배열은 이하와 같은 이미지가 될까요.



각 요소에 대해 별도로 배열을 생성하기 위해 각각 독립적 인 객체로 존재합니다.
그래서 별개로 변경을 할 수 있다는 것 같습니다.

마지막으로



이상, 2차원 배열의 만드는 방법으로 넘어졌던 포인트에 대해서, 나름대로 정리해 보았습니다.
참조 등을 읽으면서 정리하겠습니다만,
만약 실수등 있으면, 지적해 주시면 기쁩니다.

좋은 웹페이지 즐겨찾기