Search

멀티탭 스케줄링

Created
2022/05/06 01:46
문제 번호
1700
카테고리
그리디

Code

제출 날짜

@5/6/2022

메모리

940 KB

시간

4 ms
package main import ( "bufio" "fmt" "os" ) // 3개의 케이스를 생각할 수 있음 // 첫 째는 빈 구멍이 있어서 멀티탭에 기기를 꽂을 수 있는 경우 // 둘 째는 꽂으려는 기기가 이미 꽂혀 있는 경우 // 셋 째는 기존에 꽂혀 있는 기기를 뽑아야 하는 경우 // 1, 2번 케이스는 그냥 루프에서 무시하면 되는데, 3번은 각각 멀티탭에 꽂혀 있는 값들이 현재 서칭하고 있는 인덱스로부터 마지막에 위치한 인덱스가 어느 것이 더 나중에 나오는지에 따라 분기 // 멀티탭에 꽂혀 있는 값들 중 마지막에 위치한 인덱스가 더 높은 값을 대치 type Data struct { R *bufio.Reader W *bufio.Writer Answer int // 정답 NumberOfHole int // 멀티탭 구멍 수 NumberOfUsage int // 전기 용품 사용 횟수 CurrentStatus map[int]bool // 전기 용품 사용 현황 Electronics []int // 전기 용품 ID } func inputAction() *Data { d := &Data{CurrentStatus: map[int]bool{}, Electronics: []int{}} d.R = bufio.NewReader(os.Stdin) d.W = bufio.NewWriter(os.Stdout) fmt.Fscan(d.R, &d.NumberOfHole, &d.NumberOfUsage) for i := 0; i < d.NumberOfUsage; i++ { var id int fmt.Fscan(d.R, &id) d.Electronics = append(d.Electronics, id) } return d } func ignorePlugOut(d *Data, e int) bool { if _, ok := d.CurrentStatus[e]; ok { return true } else if len(d.CurrentStatus) < d.NumberOfHole { d.CurrentStatus[e] = true return true } return false } func conductPlugOut(d *Data, i, e int) { deviceId, lastIndex := -1, -1 for key, val := range d.CurrentStatus { if !val { continue } searchIndex := 0 for j := i + 1; j < d.NumberOfUsage; j++ { if key == d.Electronics[j] { break } searchIndex++ } if lastIndex < searchIndex { lastIndex = searchIndex deviceId = key } } d.Answer++ delete(d.CurrentStatus, deviceId) d.CurrentStatus[e] = true } func Solution(d *Data) { for i, e := range d.Electronics { if ignorePlugOut(d, e) { continue } conductPlugOut(d, i, e) } } func outputAction(d *Data) { fmt.Fprint(d.W, d.Answer) } func main() { d := inputAction() defer d.W.Flush() Solution(d) outputAction(d) }
C++
복사