{ }codelper
내포(컴프리헨션)2차원 목록P0083

표 뒤집고 거르기

r줄 c칸의 정수 표가 주어진다.
반복문 대신 내포(comprehension)로 다음 세 가지를 만들어 출력하라. 1) 뒤집은 표: 원래 표의 j번째 칸들(위에서 아래로)이 새 표의 j번째 줄이 된다.
c줄에 걸쳐 한 줄에 r개씩, 빈칸 하나로 띄워 출력한다. 2) 3의 배수 제곱: 표를 위 줄부터, 한 줄 안에서는 왼쪽부터 읽으면서 3의 배수(0과 음수 포함)만 골라 제곱한다.
고른 개수 k를 먼저 쓰고, 이어서 제곱한 값 k개를 읽은 차례대로 한 줄에 빈칸으로 띄워 출력한다.
하나도 없으면 0만 출력한다. 3) 표에 나오는 서로 다른 값의 개수를 출력한다.

입력
첫 줄에 r c, 다음 r줄에 정수 c개씩.
1 ≤ r, c ≤ 50, -1000 ≤ 값 ≤ 1000
출력
c줄의 뒤집은 표, 그다음 줄에 k와 제곱 k개, 마지막 줄에 서로 다른 값의 개수
예시 1 · stdin
2 3
1 3 -6
4 9 3
stdout
1 4
3 9
-6 3
4 9 36 81 9
5
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 1개 언어 풀이

이 문제는 Python만 받아요.
목록·집합 내포는 Python 문법이고, 다른 언어는 같은 일을 반복문이나 map·filter(JS), 스트림(Java), LINQ(C#)로 해요.
내포 안의 for는 반복문을 겹쳐 쓸 때와 같은 차례로 적어요: [x * x for row in grid for x in row if x % 3 == 0]은 바깥 for row가 먼저예요.
차례를 바꿔 열부터 돌면 펼치는 순서가 달라져요.
뒤집기는 내포를 겹친 [[row[j] for row in grid] for j in range(c)](또는 zip(*grid))이고, [[0] * r] * c로 칸을 먼저 만들면 같은 줄이 c번 담겨 모든 줄이 똑같아져요.
대괄호 대신 소괄호 (x for row in grid for x in row)는 생성기라서, 한 번 다 쓰고 나면 두 번째로 돌 때는 비어 있어요(서로 다른 값이 0개가 돼요).
Python은 -6 % 3이 0이라 음수 배수도 그대로 걸러져요.
크레이콘이라면 각각 (x 에서 row) 반복문과 넣기로 만들어요.

Pythonmain.py · 14 줄
r, c = map(int, input().split())grid = [[int(x) for x in input().split()] for _ in range(r)] # 1) 뒤집기: 열 j를 줄로 — 바깥 내포가 새 줄, 안쪽 내포가 그 줄의 칸flipped = [[row[j] for row in grid] for j in range(c)]for line in flipped:    print(" ".join(str(x) for x in line)) # 2) 펼치며 거르기: for를 읽는 차례(위 줄 → 그 줄의 칸) 그대로 적는다squares = [x * x for row in grid for x in row if x % 3 == 0]print(len(squares), *squares) # 3) 집합 내포: 서로 다른 값의 개수print(len({x for row in grid for x in row}))