Inflearn brand logo image

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

정구호님의 프로필 이미지
정구호

작성한 질문수

[파이썬/Python] 문과생도 이해하는 DFS 알고리즘! - 입문편

섬의 개수 (백준 4963)

침투/섬개수 질문

작성

·

97

1

침투/섬의개수 질문드립니다.

 

  1. 침투 문제에서는 연속된 숫자가 들어와서 row=input() 이렇게 표현 하셨는데 연속된 숫자가 들어올거라는 것을 어떻게 유추할수 있을까요?

 

  1. 섬의개수 문제에서는 침투와 달리 row=list(map(int,input().split())) 이렇게 표현하셨는데, 침투랑 동일하게 row=input()으로 표현해도 되는거 아닌가요? 연결정보 채우는거에 대한 언급을 어떻게 찾는지 궁금합니다

 

 

 

답변 2

1

안녕하세요 정구호님 🙂

입력 형태는 문제에서 주어지는 예제 입력 형태를 보고 설명과 함께 유추할 수 있습니다! 대부분의 경우 이 부분은 헷갈리지 않도록 명확하게 적어주고 있어서, 예제 형태를 그대로 적용하시면 될 것 같습니다!

 

그리고 다음 추가 질문에 대해 답변 드리자면

하나더 질문이 있는데 섬의개수에서
for i in range(1,H+1)

row = list(map(int,input().split()))

이 부분으로 그래프를 채울수 있는거 아닌가요? 이 코드 이후에 것(for j in range(1, M + 1): map_[i][j] = (row[j - 1] == 1))들은 왜 구현한건지 이해가 잘안됩니다

row 변수는 한 행에 해당하는 입력 값을 하나의 list로 입력 받은 것이고, 이 정보를 다시 map에 반영하기 위해서는 row list의 값을 확인하여 하나씩 입력해줘야 하기 때문에 이렇게 넣었습니다!

0

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

정구호님께서 질문하신 내용을 기반으로, DFS 알고리즘 강의에서 다루는 ‘침투’와 ‘섬의 개수’ 문제에 대해 차이점과 입력 방법에 대해 설명드리겠습니다.

  1. 침투 문제에서 연속된 숫자 입력 방식:

    • 이 문제에서 주어진 입력은 종종 2D 배열 형태로, 각 줄(행)에 대해 연속적으로 데이터가 주어질 가능성이 높습니다. 기본적으로 알게된 것처럼, 문제가 주어진다면 문제의 설명이나 예제를 통해 입력 데이터의 형식을 제시받는 경우가 많습니다. 일반적으로 문제에서 입력 형식을 명시하기 때문에 row = input()로 처리하여 연속된 문자열을 읽고 각 문자나 숫자를 처리하는 것이 가능합니다.
  2. 섬의 개수 문제에서의 입력 방식 차이:

    • 반면에 ‘섬의 개수’ 문제에서는 보통, 각 요소가 공백으로 구분된 형태로 제공됩니다. 그래서 row = list(map(int, input().split()))을 사용하여 한 줄에 있는 여러 수를 리스트에 담아 처리합니다. 이는 문제의 설명에 따라, 입력의 각 요소가 어떻게 분리되어 있는지에 따라 결정되는 부분입니다.

이와 관련해서 더 자세히 알고 싶으시면, 이전에 비슷한 문제에 대해 논의한 질문들을 참조하면 도움이 될 수 있습니다:

이 링크들은 주로 다양한 입력 방식에 따라 어떻게 코드를 작성하고 문제를 접근해야 하는지에 대한 설명을 포함하고 있습니다.

문제의 입력 형식을 이해하기 위해서는 항상 주어진 문제의 설명과 예제를 꼼꼼히 읽는 것이 중요합니다. 문제 설명에 따라 입력 데이터를 제대로 처리할 수 있게될 것입니다.

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

정구호님의 프로필 이미지
정구호
질문자

문제의 글에서 데이터가 어떻게 들어올지 추측 한다는 말인 건가요?
하나더 질문이 있는데 섬의개수에서
for i in range(1,H+1)

row = list(map(int,input().split()))

이 부분으로 그래프를 채울수 있는거 아닌가요? 이 코드 이후에 것(for j in range(1, M + 1): map_[i][j] = (row[j - 1] == 1))들은 왜 구현한건지 이해가 잘안됩니다

안녕하세요 cgh7165499님!

row = list(map(int, input().split()))는 한 줄의 입력을 리스트로 받아오는 단계일 뿐이고, 이 데이터를 우리가 사용하는 map_이라는 2차원 배열에 정확한 위치에 반영해줘야 합니다. 즉,

for j in range(1, M + 1): map_[i][j] = (row[j - 1] == 1)

이 부분은 row의 값을 실제 지도(map_)의 좌표에 맞게 복사하면서 동시에 1인지 여부만을 불리언 형태로 저장하는 코드입니다. 이렇게 따로 나눈 이유는:

  1. 문제에서 padding(여백)을 둘 필요가 있어 map_을 1-indexed로 구성했기 때문이고,

  2. 입력값이 꼭 01이 아닐 수도 있으므로, 조건을 명시적으로 걸어주는 과정이 필요하기 때문입니다.

따라서 단순히 rowmap_에 넣는 것만으로는 원하는 형태의 그래프 구성이 되지 않기 때문에, 이 추가 코드가 필요합니다!

정구호님의 프로필 이미지
정구호

작성한 질문수

질문하기