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

yuniv님의 프로필 이미지
yuniv

작성한 질문수

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

3-B

3-B 보물섬 코드 질문입니다.

작성

·

149

0

안녕하세요 큰돌님! 강의 잘보고 있습니다!
보물섬 문제를 푸는데 궁금한 점이 있어서 질문드립니다.

로직은 거의 동일하게 풀었습니다만, 문자가 다닥다닥붙어서 입력되는걸보고 scanf와 printf를 사용해보았는데 틀렸다고 나와서요.

큰돌님이하신 방법대로 cin과 cout으로 교체해주었더니, 맞았다고 나왔지만 어느 부분이 다른 건지(혹은 틀린건지) 잘 모르겠습니다. ㅠㅠ
아래 코드에서 주석 처리한 부분이 제가 처음에 작성했던 코드입니다.

http://boj.kr/f3f04689b13c429d830e4dda8b3d9505

답변 기다리겠습니다!

답변 2

0

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

안녕하세요 yuniv님 ㅎㅎ

정말 잘 짜셨네요 ㅎㅎ

scanf와 printf를 이용하신다면 다음과 같이 구축하시면 됩니다.

#include <bits/stdc++.h>
using namespace std;

int n, m, md;
char a[54][54];
int visited[54][54];

const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};

void bfs(int y, int x){
    
    memset(visited, 0, sizeof(visited));
   
    visited[y][x] = 1; 
    queue<pair<int, int>> q;
    q.push({y, x});

    while (!q.empty()) {
        tie(y, x) = q.front();
        q.pop();

        for (int i = 0; i < 4; i++) {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if (ny < 0 || nx < 0 || ny >= n || nx >= m) continue;
            if (visited[ny][nx]) continue;
            if (a[ny][nx] == 'W') continue;
            visited[ny][nx] = visited[y][x] + 1;
            md = max(visited[ny][nx], md);
            q.push({ny, nx});
        }
    }
}

int main() {

    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        scanf("%s", a[i]);
    }
    
    md = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] == 'L') bfs(i, j);
        }
    }

    printf("%d\n", md - 1);
    return 0;
}

 

만약 %c 이런식으로 받고 싶으시다면.

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf(" %c", &a[i][j]);  // 공백 문자를 사용하여 공백 및 개행 문자를 무시
        }
    }

이렇게 하시면 됩니다.

 

이부분은 사실 교안에 있는 내용인데요 ㅎㅎ

해당 부분 참고 부탁드립니다.

image


하지만 전체적으로 너무 잘 짜셨습니다 ㅎㅎ

코드가 너무 깔끔합니다.



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

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

감사합니다.

강사 큰돌 올림.


yuniv님의 프로필 이미지
yuniv
질문자

교안을 다시한번 복습해야겠네요 ㅎㅎ 답변 정말 감사합니다!

0

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

yuniv님의 질문과 관련하여 보물섬 문제에 대해 scanf와 printf, 그리고 cin과 cout 사용에 따른 차이와 해결책에 대해 설명하는 유사한 경우를 찾았습니다.

큰돌님이 제공한 답변에서, 입출력 함수 사용 방식에 따른 차이점과 cin, cout 사용 시 주의할 점을 설명하고 있습니다. 이전 질문에서도 cin과 cout 대신 scanf와 printf를 사용하였을 때 정답 처리된 경우가 있었고, 이로 인해 발생할 수 있는 문제점과 그 해결방법에 대한 설명이 포함되어 있습니다. 질문자가 겪고 계신 문제와 유사한 상황이므로 참고하시면 도움이 될 것입니다.

  • “2-A 질문드립니다!” 질문에서의 답변에서는 cin과 cout을 사용할 때 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 코드를 사용해 입출력 싱크를 맞추는 것을 해제하는 것에 대해 설명하고 있습니다. scanf와 printf를 함께 사용하면 예상치 못한 문제가 발생할 수 있음을 지적합니다.

위의 설명을 통해 yuniv님의 경우도 입출력 함수를 혼합하여 사용함으로써 발생한 문제일 가능성이 높습니다. 위 링크가 설명하는 내용을 바탕으로, 입출력 처리 방식을 통일하고 필요하다면 입출력 싱크를 맞추는 방식을 변경해 볼 것을 권장합니다.

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

yuniv님의 프로필 이미지
yuniv

작성한 질문수

질문하기