직사각형 배열을 위 행부터 읽어요. 첫 행은 왼쪽→오른쪽, 둘째 행은 오른쪽→왼쪽으로 읽고 이 방향을 행마다 번갈아 적용해 하나의 수열을 만들어요. 그 수열을 오른쪽으로 shift 칸 순환 이동해요. 끝을 넘은 값은 앞쪽으로 돌아와요.
최종 수열의 각 값에 1부터 시작하는 위치 번호를 곱한 합을 반환해요. int solution(vector<vector<int>> board, int shift)의 잘못된 한 줄을 고쳐 주세요.
행·열은 각각 110, 모든 행의 길이는 같고 각 값은 0100이에요. shift는 0~500, 배열은 비어 있지 않고 중복값을 허용해요. 반환형은 int예요.
예시 1: board = {{1, 2, 3}, {4, 5, 6}}, shift = 1 → 84. 읽은 수열은 1·2·3·6·5·4이고, 옮기면 4·1·2·3·6·5예요. 위치를 곱한 합은 84예요.
예시 2: board = {{1, 2}, {3, 4}}, shift = 0 → 29. 수열 1·2·4·3에 번호 1·2·3·4를 곱해 29예요.
실행 입력은 R C shift, 다음 R줄의 C 개 값이에요. main은 함수 호출용 하네스이며 합을 출력해요.
예시 입력
2 3 1
1 2 3
4 5 6
예상 결과
84
예시 입력
2 2 0
1 2
3 4
예상 결과
29
핵심 개념
simulation-2d: 좌표 변환과 반복 뒤의 상태를 추적해요.
array-2d: 행·열과 이동 가능한 칸을 구분해요.
stl-vector: 원소 순서와 길이를 계약에 맞게 유지해요.
#include <iostream>
#include <vector>
using namespace std;
int solution(vector<vector<int>> board, int shift) {
int rows = (int)board.size(), cols = (int)board[0].size();
vector<int> sequence;
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
int col = (r % 2 == 0) ? cols - 1 - c : c;
sequence.push_back(board[r][col]);
}
}
int n = (int)sequence.size();
vector<int> moved(n);
for (int i = 0; i < n; ++i) moved[(i + shift) % n] = sequence[i];
int answer = 0;
for (int i = 0; i < n; ++i) answer += moved[i] * (i + 1);
return answer;
}
int main() {
int rows, cols, shift; cin >> rows >> cols >> shift;
vector<vector<int>> board(rows, vector<int>(cols));
for (int r = 0; r < rows; ++r)
for (int c = 0; c < cols; ++c) cin >> board[r][c];
cout << solution(board, shift) << '\n';
}