# [Python TIL] 2차원 리스트(배열) 입력받는 다양한 방법

Python에서 2차원 리스트(행렬, matrix)를 입력받는 방법을 정리해볼게요.  
입력 방식은 여러 가지가 있으며, 그중 **중간에 빈 줄이 있는 경우를 처리하는 방법**도 함께 알아보겠습니다! 🚀

---

## ✅ 2차원 리스트(배열) 입력받는 기본적인 방법

### 🔹 방법 1: `for` 문을 사용하여 고정된 크기의 행렬 입력받기

입력 크기가 정해져 있다면 가장 직관적인 방법입니다.

```python
matrix = [list(map(int, input().split())) for _ in range(3)]
print(matrix)
```

🔹 **입력 예시:**

```python
1 2 3
4 5 6
7 8 9
```

🔹 **출력:**

```python
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```

✅ **사용 용도:** 행 개수가 정해져 있을 때 유용

---

### 🔹 방법 2: [`sys.stdin.read`](http://sys.stdin.read)`()`를 사용하여 가변적인 크기의 입력 처리

```python
import sys
data = sys.stdin.read().strip().split("\n")  # 여러 줄 입력받기
matrix = [list(map(int, row.split())) for row in data]
print(matrix)
```

🔹 **입력 예시:**

```python
1 2 3
4 5 6
7 8 9
```

🔹 **출력:**

```python
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```

✅ **사용 용도:** 입력 개수를 미리 모를 때 사용

---

## 🚀 ✅ 빈 줄이 포함된 2차원 리스트 입력받기

### 🔹 문제: **입력값에 중간에 빈 줄이 있을 때, 이를 무시하고 행렬을 읽어야 한다.**

```python
1 2 3
4 5 6
7 8 9

2 3 4
5 6 7
8 9 10
```

💡 이때, **빈 줄을 무시하고** 두 개의 행렬을 제대로 분리해서 입력받는 방법이 필요합니다!

---

### ✅ 해결 방법 1️⃣: `while` 루프를 활용하여 빈 줄 무시

```python
matrix1 = []
matrix2 = []

# 첫 번째 행렬 입력 (빈 줄 무시)
while len(matrix1) < 3:
    row = input().strip()
    if row:  # 빈 줄이 아니면 추가
        matrix1.append(list(map(int, row.split())))

# 두 번째 행렬 입력 (빈 줄 무시)
while len(matrix2) < 3:
    row = input().strip()
    if row:  # 빈 줄이 아니면 추가
        matrix2.append(list(map(int, row.split())))

print(matrix1)
print(matrix2)
```

🔹 **입력 예시:**

```python
1 2 3
4 5 6
7 8 9

2 3 4
5 6 7
8 9 10
```

🔹 **출력:**

```python
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[2, 3, 4], [5, 6, 7], [8, 9, 10]]
```

✅ **사용 용도:** **빈 줄을 건너뛰면서 일정 개수의 행렬을 입력받고 싶을 때 유용**

---

### ✅ 해결 방법 2️⃣: [`sys.stdin.read`](http://sys.stdin.read)`()`를 사용하여 한 번에 입력받고 빈 줄 제거

```python
import sys

data = sys.stdin.read().strip().split("\n")  # 전체 입력을 받아 줄 단위로 분할
data = [row.strip() for row in data if row.strip()]  # 빈 줄 제거

matrix1 = [list(map(int, data[i].split())) for i in range(3)]
matrix2 = [list(map(int, data[i + 3].split())) for i in range(3)]

print(matrix1)
print(matrix2)
```

🔹 **입력 예시:**

```python
1 2 3
4 5 6
7 8 9

2 3 4
5 6 7
8 9 10
```

🔹 **출력:**

```python
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[2, 3, 4], [5, 6, 7], [8, 9, 10]]
```

✅ **사용 용도:** **입력 개수를 모를 때, 한 번에 모든 데이터를 처리하고 싶을 때 사용**

---

## 🎯 어떤 방법을 선택할까?

| 방법 | 특징 | 장점 | 단점 |
| --- | --- | --- | --- |
| `for` 문 사용 | 입력 개수 고정 | 직관적, 간단함 | 유동적인 입력 처리 어려움 |
| [`sys.stdin.read`](http://sys.stdin.read)`()` | EOF까지 입력받기 | 대량 데이터 처리에 적합 | 모든 데이터를 한꺼번에 처리해야 함 |
| `while` 루프 | 빈 줄 무시 가능 | 유연한 입력 처리 | 코드가 길어질 수 있음 |

---

## 🔥 정리

1. **입력 개수가 정해져 있다면** → `for` 문 사용
    
2. **입력 개수가 미정이면** → [`sys.stdin.read`](http://sys.stdin.read)`()` 활용
    
3. **빈 줄을 포함한 입력 처리** → `while` 루프 or [`sys.stdin.read`](http://sys.stdin.read)`()`+`strip()`
