| English | 의미 |
|---|---|
| nested loops/ˈnestɪd luːps/ | 중첩 루프 |
| row-major order/rəʊ ˈmeɪdʒə ˈɔːdə/ | 행 주 ordered |
| enhanced for/enˈhænst fɔː/ | 강화 for |
직사각형 격자는 잘못된 루프 경계를 노출합니다
- 격자는 두 행과 세 열로 구성됩니다. 양쪽 인자에 대해 g.length로 경계를 설정한 루프는 첫 번째 두 열만 방문합니다.
- r < g.length를 사용하고, 각 행에 대해 c < g[r].length를 적용하십시오. 이는 서로 다른 길이의 행도 처리할 수 있으며, g[0].length는 비어 있지 않은 직사각형 격자를 가정합니다.
격자를 위한 중첩 루프
- 2차원 배열의 모든 셀을 방문하려면 중첩 루프를 사용하십시오(단위 2 참조). 바깥 루프는 행을, 안쪽 루프는 열을 순회합니다:
for (int r = 0; r < g.length; r++) { for (int c = 0; c < g[r].length; c++) { ... g[r][c] ... } }안쪽 루프가 한 행 전체를 스캔한 후 바깥 루프가 다음 행으로 이동합니다.
행 우선 순서(row-major order)
- 이 중 Nested 구조는 **행 우선 순서(row-major order)**로 셀을 방문합니다: 행 0 전체, 이후 행 1, …
g[0][0], g[0][1], …, g[1][0], g[1][1], …순으로 - 이는 자연스러운 읽기 순서입니다—왼쪽에서 오른쪽, 위에서 아래로. 비어 있지 않은 직사각형 격자의 경우 열을 바깥 루프로 사용하여 열 단위로 셀을 방문할 수도 있습니다. 불규칙한 행(ragged array)은 일부 행이 포함하지 않는 열에 대해 명시적인 정책을 필요로 합니다.
for-each 버전
- 2-D 배열에 대한 향상된(eenhanced) for 루프는 한 번에 행(row)(1-D 배열) 하나를 제공합니다.
for (int[] row : g) { for (int x : row) { ... x ... } } - 바깥 변수는 행 전체이며, 안쪽 변수는 해당 행의 값을 순회합니다. 기본 데이터 타입(primitive) 루프 변수를 재할당하면 저장된 셀은 업데이트되지 않습니다. 행 변수는 여전히 참조이므로 인덱스 기반 안쪽 루프를 통해
row[c]을 수정할 수 있습니다.
행 우선 순회 (Row-major traversal)
외부 루프는 행, 내부 루프는 열: 1,2,3,4,5,6 순서로 방문.
여기서 표시된 어떤 패턴이 행 참조가 모두 비null인 비null 2-D int 배열의 모든 셀을 방문합니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
외부는 행, 내부는 열.
표시된 행 우선 2-D 순회 외부 루프는 ...에 의해 제한되어야 합니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
외부 행 루프는 g.length를 사용하고, 내부 셀 루프는 g[r].length를 사용하여 불일치하는 행 길이를 처리합니다.
2행 3열 그리드에서 중첩 루프는 몇 개의 셀을 방문합니까?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
행 × 열 = 2 × 3 = 6.
행 우선 순회는 다음과 같은 순서로 셀을 방문합니다...
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
행 우선 = 좌우, 상하 순.
for (int[] row : g)에서 변수 row은 ...입니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
외부 for-each 변수는 행 배열입니다.
두 루프 경계 모두 g.length를 사용하면 비정방형 직사각형 격자에서 항상 예외를 발생시킵니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
거짓: 2-행, 3-열 그리드에서는 두 개의 열만 방문하여 셀을 숨김 없이 놓칩니다. 세로가 긴 그리드에서는 대신 행 경계를 넘어갈 수 있습니다.
경계 설정的正确性
- 바깥 경계:
r < g.length(행). 안쪽 경계:c < g[r].length(현재 행의 길이). 루프에 잘못된 길이를 사용하는 것은 정사각형 격자가 아닌 경우 미묘한 버그입니다. - 비어 있지 않은 직사각형 격자의 경우,
g[0].length은 또한 공통적인 열 개수를 나타내며, 안쪽 본체는rows × columns번 실행됩니다. 불규칙한 행인 경우 행 길이를 추가해야 하며, 모든 행 참조는 null이 아니어야 합니다.
행에는 g.length을, 현재 행의 셀에는 g[r].length을 사용하십시오. 행 개수를 두 경계에 모두 사용하면 넓은 격자에서는 열을 건너뛰거나 높은 격자에서는 범위를 벗어날 수 있습니다. 빈 바깥 배열은 g[0]에 접근할 필요가 없으며, null인 행의 길이를 읽기 전에 명시적 처리 정책이 필요합니다.
Order the cells visited in row-major traversal of a 2×2 grid.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
The inner loop finishes one row before the outer loop advances.
int[][] g = {{1, 2, 3}, {}, {4}};일 때, 행별 순회는 몇 개의 셀을 방문합니까?
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
행 길이를 더합니다: 3 + 0 + 1 = 4. 빈 행은 셀을 기여하지 않습니다.
2차원 배열의 합 계산:
for (int r = 0; r < g.length; r++)for (int c = 0; c < g[r].length; c++)sum += g[r][c];— 모든 행이 null이 아닌 것을 전제로하여 행 단위로 모든 셀을 방문합니다.
추론을 새로운 사례로 확장하기
int[][] g = {{1, 2, 3}, {}, {4}};의 경우, 행 길이는 3, 0, 1입니다. 행별 경계는 네 개의 셀을 방문하고 총합은 10입니다;g[0].length은 모든 행에 유효한 경계가 아닙니다.- 인덱스 기반 안쪽 루프를 사용하여 row[c]를 수정할 수 있습니다; 강화 for 루프에서 기본 데이터 타입 x를 재할당하면 셀이 업데이트되지 않습니다.
중첩 루프를 사용하여 2차원 배열을 순회합니다: 바깥은 행(r < g.length), 안쪽은 열(c < g[r].length)이며, g[r][c]에 액세스합니다. 이는 행 우선 순서로 셀을 방문합니다(행 길이의 합; 직사각형 격자의 경우 rows × columns). 강화 for(for (int[] row : g))은 한 번에 하나의 행에 대한 참조를 제공하며, 기본 데이터 타입 안쪽 변수에 할당하면 저장된 셀은 변경되지 않습니다.