백준 2980 도로와 신호등[Java]

seren-dev·2022년 5월 20일
0

https://www.acmicpc.net/problem/2980

접근

  • 첫번째 예제 입력에 대해서 직접 풀어보면서 각 신호등에 따라 반복적인 부분을 찾아내려 했다.
  • 시간 = cnt
  • cnt에 먼저 signals[0].d를 더하고, cnt % (R+G)를 구하여서 빨간불인지 초록불인지 체크
  • 빨간불이면 남은 시간만큼 cnt에 더하고 초록불이면 패스
  • 그 다음 signals[1].d - signals[0].d를 더함
  • signals[1]에 대해 빨간불, 초록불 체크
  • 빨간불이면 남은 시간만큼 cnt에 더하고 초록불이면 패스
  • 마지막으로 cntl - signals[1].d 를 더함

위의 과정에서 반복적으로 나타내는 부분을 반복문으로 작성

나의 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static class Signal {
        int d;
        int r;
        int g;
    }

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int l = Integer.parseInt(st.nextToken());
        int cnt = 0;

        Signal[] signals = new Signal[n];

        for (int i = 0; i < n; i++) {
            signals[i] = new Signal();
            StringTokenizer tmp = new StringTokenizer(br.readLine());
            signals[i].d = Integer.parseInt(tmp.nextToken());
            signals[i].r = Integer.parseInt(tmp.nextToken());
            signals[i].g = Integer.parseInt(tmp.nextToken());
        }

        int tmp;
        for (int i = 0; i < n; i++) {
            cnt += i == 0 ? signals[0].d : signals[i].d - signals[i-1].d;

            tmp = cnt % (signals[i].g + signals[i].r);
            if (tmp < signals[i].r)
                cnt += signals[i].r - tmp;
        }
        cnt += l - signals[n-1].d;

        System.out.println(cnt);
    }
}

수정한 버전

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static class Signal {
        private int d;
        private int r;
        private int g;

        public Signal(int d, int r, int g) {
            this.d = d;
            this.r = r;
            this.g = g;
        }

        public int getD() {
            return d;
        }

        public int getR() {
            return r;
        }

        public int getG() {
            return g;
        }
    }

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int l = Integer.parseInt(st.nextToken());
        int cnt = 0;

        int d, r, g;
        Signal[] signals = new Signal[n];

        for (int i = 0; i < n; i++) {
            StringTokenizer tmp = new StringTokenizer(br.readLine());
            d = Integer.parseInt(tmp.nextToken());
            r = Integer.parseInt(tmp.nextToken());
            g = Integer.parseInt(tmp.nextToken());
            signals[i] = new Signal(d, r, g);
        }

        int tmp;
        for (int i = 0; i < n; i++) {
            cnt += i == 0 ? signals[0].getD() : signals[i].getD() - signals[i-1].getD();

            tmp = cnt % (signals[i].getG() + signals[i].getR());
            if (tmp < signals[i].getR())
                cnt += signals[i].getR() - tmp;
        }
        cnt += l - signals[n-1].getD();

        System.out.println(cnt);
    }
}
  • Signal 클래스에 생성자 추가, 멤버 변수 모두 private으로 수정
  • 메모리와 시간에 큰 변화가 없음

0개의 댓글