inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

기억 ( 누적합 )

17611번 자바

해결된 질문

208

유미 이

작성한 질문수 1

1

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] x = new int[1000001];
        int[] y = new int[1000001];

        // 첫 번째 꼭짓점
        int firstW = sc.nextInt() + 500000;
        int prevH = sc.nextInt() + 500000;
        int prevW = firstW;

        // 나머지 꼭짓점
        for (int i = 1; i < n; i++) {
            int w = sc.nextInt() + 500000;
            int h = sc.nextInt() + 500000;

            if (prevW == w) { // 수직선
                y[Math.min(prevH, h)]++;
                y[Math.max(prevH, h)]--;
            } else { // 수평선
                x[Math.min(prevW, w)]++;
                x[Math.max(prevW, w)]--;
            }

            prevW = w;
            prevH = h;
        }

        // 마지막 꼭짓점과 첫 번째 꼭짓점 연결
        if (prevW == firstW) { // 수직선
            y[Math.min(prevH, firstW)]++;
            y[Math.max(prevH, firstW)]--;
        } else { // 수평선
            x[Math.min(prevW, firstW)]++;
            x[Math.max(prevW, firstW)]--;
        }

        // 큰 값 찾기
        int xMax = 0;
        int yMax = 0;
        for (int i = 1; i < 1000001; i++) {
            x[i] += x[i - 1];   // 이전 값이랑 누적합
            y[i] += y[i - 1];
            xMax = Math.max(x[i], xMax);    // 큰 값 비교
            yMax = Math.max(y[i], yMax);
        }

        System.out.println(Math.max(xMax, yMax));
    }
}

안녕하세요 17611번 문제 자바로 풀고있습니다.

백준 게시판과 인터넷에 공유된 풀이가 거의 없어 커뮤니티에 질문 올리게 되었습니다.

문제에서 주어진 예를 테스트 했을 때는 잘 작동하는데, 제출시에(40%쯤) '틀렸습니다' 라고 나옵니다. 해당 코드로는 작동하지 않는 반례 또는 식의 오류를 알려주세요. 감사합니다.

python 코딩-테스트 알고리즘

답변 2

1

인프런 AI 인턴

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

코드를 살펴보니 마지막 꼭짓점과 첫 번째 꼭짓점을 연결하는 부분에서 오류가 있는 것 같습니다. 현재 코드에서는 y[Math.min(prevH, firstW)]++;y[Math.max(prevH, firstW)]--;로 되어 있는데, 여기서 firstW가 아닌 firstH를 사용해야 하는 부분입니다. 변수 firstH는 선언되지 않았으므로, firstW와 같은 방식으로 첫 번째 꼭짓점의 높이를 저장하는 변수를 선언하고 사용해야 합니다.

올바른 접근은 다음과 같습니다:
- 첫 번째 꼭짓점의 높이를 저장할 int firstH = sc.nextInt() + 500000;를 추가하고,
- 마지막 꼭짓점과 첫 번째 꼭짓점을 연결할 때, firstH를 사용하여 수정합니다.

수정된 부분은 다음과 같습니다:

int firstH = sc.nextInt() + 500000; // 첫 번째 꼭짓점의 높이 저장 변수 선언 및 초깃값 설정
.
.
.
if (prevW == firstW) { // 수직선
    y[Math.min(prevH, firstH)]++;
    y[Math.max(prevH, firstH)]--;
} else { // 수평선
    x[Math.min(prevW, firstW)]++;
    x[Math.max(prevW, firstW)]--;
}

이러한 수정을 통해 첫 번째 꼭짓점과 마지막 꼭짓점을 올바르게 연결할 수 있고, 해당 문제에서 ‘틀렸습니다’ 오류를 해결할 수 있을 것입니다.

1

유미 이

위 상황으로 해결했습니다. 감사합니다.

0

코딩 센세

늦게 답변드려 죄송합니다..!! 이제 확인했네요.. 😢

질문 감사드립니다!

dp[x]가 최대값이라고 확신할수 있는 이유

0

46

1

1090번 문제 질문

0

151

1

유니온파인드

0

112

1

투포인터 25:15 질문

1

129

1

#1090번 문제 반례가 궁금합니다.

0

148

1

예제코드 자바입니다

1

187

1

정수론 파트 #2247 문제에 대한 질문입니다!

0

102

0

코드 오류

0

186

1

2강 정수론 문제3 #1407 질문

0

127

0

이차원 배열 (int형)dp로 0 혹은 -1로 체크하는 방법 말고 boolean형 배열로 체크해서 바로 리턴해줄 수 없나요?

0

154

0

1717번 최적화

0

112

0

백준 22988 문제 질문

1

193

2

[Python] 백준 1090번 문제

1

226

3

강의자료에서

1

162

2

2503 문제 제한 조건 질문!

1

249

2

백준 22988 번 문제

1

193

1

추가 강의 순서

1

181

2

(*문제 풀이)1090 테스트케이스 1번 C++

1

221

2

7강 RGB 색칠하기 질문 있습니다.

1

161

2

정수론 약수 빠르게 구하기 질문

1

257

1

1090 문제의 2, 3번째 아이디어는 결국 같은거 아닌가요?

1

375

2

1090 문제 관련하여 맨해튼 거리 최솟값에 대해 질문 있습니다.

1

223

2

누적합 문제 3번 질문

1

216

2

기억 ( 누적합 ) 강의 11660 문제

1

163

2