코드트리 조별과제 2회차(7.22 ~ 7.28)

2024. 7. 28. 00:33·알고리즘 (with JAVA)/코드트리 조별과제

+1-1 Techinque

- 아래와 같은 문제가 있다.

1차 수직선 상에서 가로 n개의 선분이 주어졌고 어떤 임의의 세로 수직선을 그었을 때,

만나는 서로 다른 선분의 개수는?

 

답: 3개

 

- 그림을 통해 봤을 때 당연히 3개라는 것은 알 수 있지만, 이를 컴퓨터로 구현하기 위해서는 어떻게 해야 할까?

 

- 바로 1차 선분의 시작점과 끝점에 각각 +1과 -1을 붙이는 것이다.

 

- 시작점과 끝점의 가중치 값을 부여하고 빨간선 앞쪽에 있는 가중치 값들 모두 더해주면 답이 나오게 된다.

 

- 이 점을 활용하면 주어지는 모든 선분 N개를 각각 2개의 시작점, 끝점으로 구분하여 총 2N개의 점으로 나눠 이를 x좌표 순으로 오름차순 정렬한 뒤, x = k보다 커지기 직전까지의 숫자를 전부 더하는 식으로 진행해볼 수 있다.

 

- 구현 방법에는 2가지가 존재하며, 좌표의 범위에 따라 나뉜다.

 

 

구현 방법 (1)  - 좌표 범위가 작을 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Segment {
    int x1, x2;
 
    public Segment(int x1, int x2){
        this.x1 = x1;
        this.x2 = x2;
    }
};
 
public class Main {
    public static void main(String[] args) {
        Segment[] segments = new Segment[]{
            new Segment(1, 5),
            new Segment(4, 7),
            new Segment(3, 6),
            new Segment(5, 10),
            new Segment(9, 13),
            new Segment(8, 15),
            new Segment(12, 16),
        };
        int n = 7;
        int k = 11;
        
        // 주어진 좌표의 범위가 작을 때에는
        // 배열을 이용하여 직접 각 칸에
        // +1 -1을 진행해도 무방합니다.
        int[] checked = new int[21];
 
        for(int i = 0; i < n; i++) {
            int x1 = segments[i].x1;
            int x2 = segments[i].x2;
            checked[x1] += 1;
            checked[x2] -= 1;
        }
 
        // x = k 전까지
        // 각 위치에 적혀있는 숫자들의 합을 구해줍니다.
 
        int sumVal = 0;
        for(int i = 1; i < k; i++)
            sumVal += checked[i];
        
        // x = k에 겹쳐져 있는 선분의 수 = 2
        System.out.println(sumVal);
    }
}
 
Colored by Color Scripter
cs

 

 

구현 방법 (2)  - 좌표 범위가 클 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import java.util.ArrayList;
import java.util.Collections;
 
class Segment {
    int x1, x2;
 
    public Segment(int x1, int x2){
        this.x1 = x1;
        this.x2 = x2;
    }
};
 
class Point implements Comparable<Point> {
    int x, v;
 
    public Point(int x, int v){
        this.x = x;
        this.v = v;
    }
 
    @Override
    public int compareTo(Point p) { // x 오름차순
        return this.x - p.x;
    }
};
 
public class Main {
    public static void main(String[] args) {
        Segment[] segments = new Segment[]{
            new Segment(1, 5),
            new Segment(4, 7),
            new Segment(3, 6),
            new Segment(5, 10),
            new Segment(9, 13),
            new Segment(8, 15),
            new Segment(12, 16),
        };
        int n = 7;
        int k = 11;
        
        // 주어진 좌표의 범위가 큰 경우에는
        // 각 선분을 두 지점으로 나눠서
        // +1, -1로 담은 뒤,
        // 정렬해줍니다.
        ArrayList<Point> points = new ArrayList<>();
 
        for(int i = 0; i < n; i++) {
            int x1 = segments[i].x1;
            int x2 = segments[i].x2;
            points.add(new Point(x1, +1)); // 시작점
            points.add(new Point(x2, -1)); // 끝점
        }
 
        // 정렬을 진행합니다.
        // ArrayList에 대한 정렬에는 Collections를 이용합니다.
        Collections.sort(points);
 
        // x = k 전까지
        // 각 위치에 적혀있는 숫자들의 합을 구해줍니다.
        int sumVal = 0;
        for(int i = 0; i < 2 * n; i++) {
            int x = points.get(i).x;
            int v = points.get(i).v;
 
            // x가 k 이상이 되면 종료합니다.
            if(x >= k)
                break;
 
            // 적혀있는 가중치를 전부 더해줍니다.
            sumVal += v;
        }
        
        // x = k에 겹쳐져 있는 선분의 수 = 2
        System.out.println(sumVal);
    }
}
 
Colored by Color Scripter
cs

 

 

연습문제 - (코드트리) 가장 많이 겹치는 구간

[개념]가장 많이 겹치는 구간 | 알고리즘 기본 (codetree.ai)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, checked[], ans;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
 
        N = Integer.parseInt(br.readLine());
 
        checked = new int[200001];
 
        for(int i=1; i<=N; i++){
            st = new StringTokenizer(br.readLine());
            int x1 = Integer.parseInt(st.nextToken());
            int x2 = Integer.parseInt(st.nextToken());
            
            checked[x1]++;
            checked[x2]--;
        }
 
        solve();
 
        System.out.println(ans);
    }
 
    static void solve(){
        int cnt=0;
 
        for(int i=1; i<=200000; i++){
            cnt += checked[i];
            ans = Math.max(ans, cnt);
        }
    }
}
Colored by Color Scripter
cs

 

저작자표시 (새창열림)

'알고리즘 (with JAVA) > 코드트리 조별과제' 카테고리의 다른 글

코드트리 조별과제 6회차 (8.19 ~ 8.25)  (0) 2024.08.19
코드트리 조별과제 5회차 (8.12 ~ 8.18)  (0) 2024.08.12
코드트리 조별과제 4회차 (8.05 ~ 8.11)  (0) 2024.08.06
코드트리 조별과제 3회차(7.29 ~ 8.04)  (1) 2024.08.03
'알고리즘 (with JAVA)/코드트리 조별과제' 카테고리의 다른 글
  • 코드트리 조별과제 6회차 (8.19 ~ 8.25)
  • 코드트리 조별과제 5회차 (8.12 ~ 8.18)
  • 코드트리 조별과제 4회차 (8.05 ~ 8.11)
  • 코드트리 조별과제 3회차(7.29 ~ 8.04)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      람다식
      자바 개념
      중간연산
      유용한 클래스
      file
      java.time 패키지
      java.lang패키지
      제자리 정렬
      ServerSocket
      TCP 소켓 프로그래밍
      안드로이드 스튜디오
      문자 기반 스트림
      안정 정렬
      알고스팟
      serializable
      Arrays
      map()
      다형성
      snail
      코드트리
      역직렬화
      스트림
      InputStream
      코딩테스트
      불안정 정렬
      선택 정렬
      outputstream
      소켓 프로그래밍
      Collections Framework
      코딩트리조별과제
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    코드트리 조별과제 2회차(7.22 ~ 7.28)
    상단으로

    티스토리툴바