[SWEA, Java] 4408 자기 방으로 돌아가기

김서영·2022년 7월 26일

코딩테스트 스터디

목록 보기
8/11

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWNcJ2sapZMDFAV8

해결

아래에 참고 블로그를 적어뒀다. 아주 도움이 많이 됨!

우선 나는 입력은 2차원 배열에 받고 visited 라는 1차원 배열을 두었다.
for문을 돌면서, 방을 이동한 학생은 visited[i] = -1 라는 식으로 표시를 해두고, 그 전 학생들과 복도에서 겹치는 구간은 없는 지 확인을 다시 하여 결론적으로 이중 for문을 돌았다.

하지만 내가 간과한 것이 있는데,

  1. 시작 방과 이동한 후 방의 번호는 항상 오름차순이 아님. 즉 8번 방에서 1번 방으로 이동할 수 있다는 점.

  2. 복도에서 겹치는 구간을 계산할 때 주의 필요! 방은 짝수방과 홀수방으로 나누어져 있기 때문에 각 방을 이동할 때 인덱스 선택이 중요하다! (방 번호 + 1) / 2 를 통해 방을 200개로 한정하자.

  3. visited 에는 단순히 -1 처럼 방문 여부를 표시하기 보다는, 그 복도(방)을 몇 명이 지났는 지를 기록하자.

코드

import java.util.Scanner;

public class no22 {
    public static void main(String args[]) throws Exception {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();
        for(int test_case = 1; test_case <= T; test_case++)
        {
            int n = sc.nextInt();
            int [][] students = new int [n][2];
            int [] visited = new int[201];
            for (int i=0;i<n;i++){
                int s = (sc.nextInt()+1)/2;
                int e = (sc.nextInt()+1)/2;
                if (s>e){
                    int tmp = s;
                    s = e;
                    e = tmp;
                }
                students[i][0] = s;
                students[i][1] = e;
                int cnt = 0;
                for (int j=s; j<e+1; j++) {
                    visited[j] += 1;
                }
            }
            int time = 0;
            for (int i=0; i<201; i++){
                if (visited[i] > time){
                    time = visited[i];
                }
            }
            System.out.printf("#%d %d\n",test_case,time);
        }
    }
}

참고

https://jennnn.tistory.com/28

사담

아니 나는 내가 greedy가 그나마 제일 잘하는 것이라 생각했는데 SWEA D4 문제 만나니깐 바로 이렇게....

profile
하지만 저는 이겨냅니다. 김서영이죠?

0개의 댓글