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

이종현님의 프로필 이미지
이종현

작성한 질문수

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

3-K와 문제의 단순화

3-K 백조 문제 메모리 초과 질문

해결된 질문

작성

·

217

0

http://boj.kr/54cbfbf55f6946edbeb3beb93d88f6bc

안녕하세요 강사님! 여태 틀린 문제 다시 한번 풀어보고 있습니다.

백조 문제에서 메모리 초과가 나서 제가 생각하기에 의심되는 부분들 (queue에 중복 좌표를 여러번 푸시하는 경우)을 없애고도 메모리 초과가 나길래 어느 부분이 문제일지 한번 봐주시면 감사하겠습니다..

로직 자체는 강사님 코드와 거의 비슷하게 떠올린 것 같은데 2차원 배열을 너무 많이 쓴 것이 문제인지.. 특정 케이스에서 queue가 너무 커지는 것이 문제일지 잘 감이 안 옵니다 ㅜ

 

답변 1

1

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

안녕하세요 종현님 ㅎㅎ

코드 자체가 깔끔하고 너무 좋은데요? ㅎㅎ

틀린 부분이 없습니다.

메모리초과가 될만한 부분도 없습니다.

bool check() {
    queue<pair<int,int>> tempQ;
    while(q.size()){

q, tempq 아름답습니다.

다만 이부분이요.

        visited2[y][x] = 1; 
        for(int i=0; i<4; i++){
            int ny = dy[i] + y;
            int nx = dx[i] + x;

이렇게 하게 되면 queue에 중복되서 담기게 됩니다. 방문하면서 visited를 걸지 않게 되면 queue 에 일단 담아두고 ~ 그 다음에 visited를 체크하게 되거든요.

image제가 이렇게 바꿔봤습니다. 이게 조금 더 시간초과가 덜 걸리는 코드라고 보시면 됩니다.

        for(int i=0; i<4; i++){
            int ny = dy[i] + y;
            int nx = dx[i] + x;
            if(ny < 0 || nx < 0 || ny >= n || nx >= m)continue;
            if(!ar[ny][nx])continue;
            if(visited2[ny][nx])continue;
            ar[ny][nx] = 0;
            visited2[ny][nx] = 1; 

이렇게 되면 다음그림처럼 queue에 중복되서 담기지 않게 되는 것이죠.

image

그러나 이부분도 수정해서 제출했는데.. 메모리초과가 뜹니다. ㅎㅎ;;

이 문제 자체가 굉장히 타이트해서 그런거 같아요. 실제로 제 코드 조차도 조금만 바꿔도 메모리초과 또는 시간초과가 뜹니다.

문제 자체는 좋으나 시간, 메모리가 타이트하게 주어지는 문제라고 생각하시고 넘어가셔도 될 거 같습니다.

코드, 아름답게 잘 짜셨습니다.

 

 

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

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

감사합니다.

강사 큰돌 올림.

이종현님의 프로필 이미지
이종현
질문자

정성스런 답변과 좋은 말씀 항상 감사합니다 ~!

이종현님의 프로필 이미지
이종현

작성한 질문수

질문하기