인프런 커뮤니티 질문&답변

윤휘영님의 프로필 이미지
윤휘영

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

2-J

2-J: 배열 인덱스 질문

작성

·

45

0

https://www.acmicpc.net/source/share/2e4e57d962ef41a9bb4bc8f670ac158c

정답 소스 중

if(a[i][j] == 0){
                while(a[i][j + 1] == -1){
                    a[i][j + 1] = cnt++;
                    j++;
                }
            }

for문에서 j < m이니, a[i][j + 1]은 배열 인덱스를 초과할 수 있는 것 아닌가요? 저는 그렇게 생각하여

while(j + 1 < m && a[i][j + 1] == -1)

이 맞다고 생각하였는데, 제 생각에서 뭐가 틀린 건지 모르겠습니다.

답변 2

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 윤휘영님 ㅎㅎ

배열의 인덱스 범위를 초과할 수 있기 때문에 다음과 같이 배열의 크기를 좀 더 넓게 설정한 것을 볼 수 있습니다.

int n, m, a[104][104];

 

for문에서 j < m이니, a[i][j + 1]은 배열 인덱스를 초과할 수 있는 것

>> m까지이니 j + 1은 m까지 가능하게 됩니다. 여기서 2차원배열을 전역변수로 설정했기 때문에 -> 0으로 모두 초기화가 되어있으며 이부분 때문에 배열의 인덱스 참조가 m이여도 로직상 문제없게 됩니다.

 

그리고 휘영님 말씀대로 해당 부분을 넣어도 됩니다.

#include <bits/stdc++.h>
using namespace std;  
int n, m, a[104][104];
string s; 
int main () {
	cin >> n >> m; 
	for(int i = 0; i < n; i++){
		cin >> s; 
		for(int j = 0; j < m; j++){ 
			if(s[j] == '.')a[i][j] = -1;
			else a[i][j] = 0;
		}
	}
	for(int i = 0; i < n; i++){ 
		for(int j = 0; j < m; j++){
			if(a[i][j] == 0){ 
				int cnt = 1;
				while(j + 1 < m && a[i][j + 1] == -1){
					a[i][j + 1] = cnt++;
					j++;
				} 
			}
		} 
	} 
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++) cout << a[i][j] << " ";
		cout << "\n";
	} 
	return 0;
}

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

안녕하세요, 인프런 AI 인턴입니다.

윤휘영님께서 질문하신 배열 인덱스 관련된 내용에 대해, 이미 큰돌님의 답변에서 비슷한 문제의 해답으로 안내가 되었습니다.

질문하신 내용은 배열의 인덱스를 초과하는 경우에 대한 처리와 관련이 있는데요. 본 문제에서는 2차원 배열을 다루며, 배열의 인덱스 초과 여부를 확인하는 로직이 필수적입니다. 큰돌님이 제공한 답변에서는 a[i][j + 1] == -1 조건을 통해 다음 요소가 특정 조건(-1이 되는 조건)을 만족할 때 이를 처리하는 로직을 설명하고 있습니다. 특히, 배열의 범위를 초과하지 않도록 주의를 기울여야 하는데, 이는 보통 배열의 크기를 넉넉히 잡거나, 인덱스 접근 전에 범위를 체크하는 코드를 추가하여 해결할 수 있습니다.

큰돌님의 첫번째 질문에 대한 답변에서는 배열 인덱스 범위를 초과하는 것에 대한 구체적인 설명이 포함되어 있습니다. 해당 답변에서는 개별 배열 요소에 접근할 때 인덱스가 배열의 크기를 초과하지 않도록 하는 방법에 대해 설명하거나, 이와 유사한 문제를 해결하는 방법을 다루고 있습니다. 이 경우처럼, ‘while’ 루프 내에서 j++를 할 때 j < m과 같은 조건을 추가로 확인하여 배열의 크기를 벗어나지 않도록 하는 것이 좋습니다.

따라서, 윤휘영님께서 생각하신 while(j + 1 < m && a[i][j + 1] == -1)은 배열의 크기를 벗어나는 것을 방지하는 매우 합리적인 접근법입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

윤휘영님의 프로필 이미지
윤휘영

작성한 질문수

질문하기