Search

선 긋기

Created
2022/05/04 13:14
문제 번호
2170
카테고리
정렬
스위핑

Code

제출 날짜

@5/4/2022

메모리

77584 KB

시간

1540 ms
package main import ( "bufio" "fmt" "os" "sort" ) // (x, y) 기준으로 x가 작은 순서대로 정렬 // (x1, y1)을 기준으로 로직을 수행할 때, 그 다음 점을 (x2, y2)라고 가정 (leftPoint는 x1, rightPoint는 y1) // 만일 두 점이 겹치는 상태라면, 기존 rightPoint와 새로운 점의 y2 비교에 따라 rightPoint를 갱신 // 두 점이 겹치지 않는 점이라면, 기존의 rightPoint - leftPoint를 길이에 누적 후 leftPoint와 rightPoint 갱신 type Line struct { BeginPosition int // 시작점 EndPosition int // 끝점 } type Data struct { R *bufio.Reader W *bufio.Writer Answer int // 정답 NumberOfLine int // 라인의 수 Lines []Line // 라인 정보들 } func inputAction() *Data { d := &Data{Lines: []Line{}} d.R = bufio.NewReader(os.Stdin) d.W = bufio.NewWriter(os.Stdout) fmt.Fscan(d.R, &d.NumberOfLine) for i := 0; i < d.NumberOfLine; i++ { line := Line{} fmt.Fscan(d.R, &line.BeginPosition, &line.EndPosition) d.Lines = append(d.Lines, line) } return d } func maxInt(i, j int) int { if i > j { return i } return j } func measureLength(d *Data) { leftPoint := -int(^uint(0)>>1) - 1 rightPoint := -int(^uint(0)>>1) - 1 for i := 0; i < d.NumberOfLine; i++ { if rightPoint >= d.Lines[i].BeginPosition { rightPoint = maxInt(rightPoint, d.Lines[i].EndPosition) } else { d.Answer += rightPoint - leftPoint leftPoint = d.Lines[i].BeginPosition rightPoint = d.Lines[i].EndPosition } } d.Answer += rightPoint - leftPoint } func Solution(d *Data) { compareLines := func(i, j int) bool { return d.Lines[i].BeginPosition < d.Lines[j].BeginPosition } sort.Slice(d.Lines, compareLines) measureLength(d) } func outputAction(d *Data) { fmt.Fprint(d.W, d.Answer) } func main() { d := inputAction() defer d.W.Flush() Solution(d) outputAction(d) }
C++
복사