inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3-K와 문제의 단순화

3-K javascript 포팅 질문드립니다.

해결된 질문

673

seungwoo lee

작성한 질문수 5

0

안녕하세요 강의 잘 듣고 있습니다.

C++ 강의에서 js 질문을 드려도 될지 싶은데 일단 적어 보겠습니다. (프론트엔드 경력 코테 준비중이라 js 를 고집하고 있는중입니다.)

3-K (백준 3197 - 백조의 호수)를 js 로 포팅 했는데 시간 초과가 발생하네요.

  1. 강사님 코드 로직을 그대로 적용 했다고 생각하는데 혹시 제코드에 빠트린게 있을지 궁금합니다. (제 눈에는 안보이네요 ㅠ)

  2. 로직이 똑같은거라면 어느부분을 개선 해야될지 조언 좀 부탁드립니다.

     

http://boj.kr/a9a2b9684a774eb3ad7e2efb5baf57d8

 

코딩-테스트 javascript C++ 코테 준비 같이 해요!

답변 2

1

seungwoo lee

수십회 시도 끝에 겨우 통과되었습니다. 별거 아닌데 진짜 시간초과가 너무 타이트 하네요.

  • 내부 함수에서 지역 변수 대신 글로벌 변수 사용

  • 큐에서 꺼낼 때 shift() 대신 index 로 접근

https://www.acmicpc.net/source/share/cd8df7c6f13f4ed8a9114901672d3f70

1

큰돌

잘하셨어요 ㅎㅎ

1

큰돌

안녕하세요 ㅎㅎ

C++외의 코드는 봐드리지 않습니다.

다만 어느정도는 주석을 달아드렸습니다. 참고해주세요.

const filePath = '/dev/stdin';
const input = require('fs')
    .readFileSync(filePath)
    .toString()
    .split('\n');
const [row, col] = input[0].split(' ').map(Number);
console.log(solution(row, col, input.slice(1).map(v => v.split(''))));
function solution(r, c, grid) {
    //good
    const distance = [[-1, 0], [0, 1], [1, 0], [0, -1]];
    const visitedSwan = Array.from({ length: r }, (v => new Array(c).fill(0)));
    const visitedIce = Array.from({ length: r }, (v => new Array(c).fill(0)));
    let ices = [];
    let swans = [];
    //some을 이용한 사례 : good
    //isAroundWall : 이라면  grid[ny][nx] === 'X' 이 들어가면 안됩니다. 
    // 그냥 범위 벗어나는지 안되는 지만 확인하는게 좋아요. 
    const isAroundWall = (y, x) => {
        return distance.some(([dy, dx]) => {
            const ny = dy + y;
            const nx = dx + x;
            return (ny in grid && nx in grid[0] && grid[ny][nx] === 'X')
        })
    }
    for (let i = 0; i < r; i ++) {
        for (let j = 0; j < c; j ++) {
            if (grid[i][j] === 'L' && !swans.length) {
                visitedSwan[i][j] = 1;
                swans.push([i, j])
                //물일 때 집어넣는 것. 
            } else if (grid[i][j] !== 'X') {
                visitedIce[i][j] = 1; 
                //이걸 왜 체크하는 거죠? 범위벗어나는 것을 확인할 필요는 없죠.
                // 입력에서 하는건데요.
                if (isAroundWall(i, j)) {
                    ices.push([i, j]);
                }
                
            }
        }
    }
    const meltIce = (ices, grid, visited) => {
        let nextIces = [];
        while (ices.length) {
            const [y, x] = ices.shift();
            for (let [dy, dx] of distance) {
                const ny = y + dy;
                const nx = x + dx;
                if (!(ny in grid) || !(nx in grid[0]) || visited[ny][nx]) continue;
                visited[ny][nx] = 1;
                if (grid[ny][nx] === 'X') {
                    grid[ny][nx] = '.';
                    nextIces.push([ny, nx]);
                }
            }
        }
        return nextIces;
    }
    const moveSwan = (swans, grid, visited) => {
        const nextSwans = [];
        while (swans.length) {
            const [y, x] = swans.shift();
            for (let [dy, dx] of distance) {
                const ny = y + dy;
                const nx = x + dx;
                if (!(ny in grid) || !(nx in grid[0]) || visited[ny][nx]) continue;
                visited[ny][nx] = 1;
                if (grid[ny][nx] === 'L') return [];
                if (grid[ny][nx] === '.') {
                    swans.push([ny, nx]);
                } else {
                    nextSwans.push([ny, nx]);
                }
            }
        }
        return nextSwans;
    }
    let count = 0;
    // 저는 bool 변수 isSwanMeet를 기반으로 while문을 돌렸는데요. 
    // 이러한 부분 등이 다른 것 같습니다. 
    while (swans.length) {
        swans = moveSwan(swans, grid, visitedSwan);
        if (!swans.length) break;
        ices = meltIce(ices, grid, visitedIce);
        count++;
    }
    return count;
}

또한, 이 백조의 호수는 C++로 구현해도 시간초과가 많이 발생하는 시간초과가 타이트한 문제임을 참고해주세요. 그렇기 때문에 TC가 맞으면 넘어가도 되는 수준의 문제입니다.

 

감사합니다.

 

0

seungwoo lee

답변 감사합니다. 주석 참고해서 좀 더 살펴보고 안되면 넘어가겠습니다.

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

30

2

2주차 개념#12 트리 순회

0

20

2

백준사이트가 종료된다고 합니다.

0

245

2

백준 서비스 종료

9

780

1

sk 하이닉스 코테 대비

0

360

2

3-G 최댓값 질문

0

50

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

82

2

3-I 코드 질문드립니다.

0

62

2

3-N 질문 있습니다.

0

66

2

학습방법

0

100

2

4-H 질문 있습니다 (코드 리뷰)

0

66

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

166

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

69

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

64

2

1-A 문제풀이 후 궁금한 점이 생겨서 질문드립니다.

0

50

2

조합 재귀 풀이 확인 해주시면 감사하겠습니다.

0

67

2

함수별 시간복잡도

0

72

2

3-h 질문입니다.

0

49

1

안녕하세요 선생님. 시간 복잡도 4번 질문있습니다.

0

52

2

1-I 문제 질문 드립니다.

0

76

2

2-P 질문입니다.

0

56

1

mac에서 시작하기 관련

0

89

2

5-Q 질문

0

63

2

풀이 코드 질문

0

64

2