코딩테스트/문제풀이

[코드트리] 신기한 타일 뒤집기

알렉스 페레이라 2023. 4. 18. 18:35

풀었는데 로직 저장해두면 좋을거같아서 기록

 

일직선으로 무한히 나열된 회색 타일이 있습니다. 이 타일은 신기한 타일이기 때문에, 현재 타일의 색이 어떤 색인지와는 상관없이 왼쪽으로 뒤집으면 흰색으로 바뀌고, 오른쪽으로 뒤집으면 검은색으로 바뀌게 됩니다.
아무 타일에서 시작하여 n번의 명령에 걸쳐 움직입니다. 명령은 "x L", "x R" 형태로만 주어지며, "x L"의 경우 왼쪽으로 이동하며 순서대로 현재 위치 타일포함 총 x칸의 타일을 왼쪽으로 뒤집습니다. "x R"의 경우 오른쪽으로 이동하며 순서대로 현재 위치 타일포함 총 x칸의 타일을 오른쪽으로 뒤집습니다. 각 명령 이후에는 마지막으로 뒤집은 타일 위치에 서있는다고 가정합니다. 모든 명령을 실행한 뒤의 흰색, 검은색 타일 수를 각각 출력하는 프로그램을 작성해보세요.

 

입력 형식

첫 번째 줄에는 n이 주어집니다.

두 번째 줄부터는 n개의 줄에 걸쳐 명령이 주어집니다. 형태는 “x L” 혹은 “x R” 입니다.

  • 1 ≤ n ≤ 1000
  • 1 ≤ x ≤ 100

출력 형식

첫 번째 줄에 모든 명령을 실행하고 난 뒤의 흰색, 검은색 타일 수를 각각 공백을 사이에 두고 출력합니다.

 

예제1

입력:

4
4 R
5 L
7 R
4 L

 

출력:

4 3

 

 

예제2

입력:

2
10 R
11 L

 

출력:

11 0

 

 

내 코드

 

import java.util.*;

class Tile{
    int white;
    int black;

    Tile(int white, int black){
        this.white = white;
        this.black = black;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); //test case

        Tile[] tileArr = new Tile[2000001]; //타일 최대갯수는 20만개다. (1000 * 100 * 2)
        int[] from = new int[n]; //시작타일
        int[] to = new int[n]; //끝타일
        String[] way = new String[n]; //현재 타일이 L인지 R인지
        int location = 0;
        int offset = 100000; //음수값을 양수로 만들기 위한 offset

        for(int i = 0; i < n; i++){
            int distance = sc.nextInt();
            String direction = sc.next();

            distance = distance == 1 ? 0 : distance - 1; //현재타일 포함해서 뒤집기때문에.
            if("L".equals(direction)){
                from[i] = location - distance;
                to[i] = location;
                way[i] = direction;
                location -= distance;
            }else{
                from[i] = location;
                to[i] = location + distance;
                way[i] = direction;
                location += distance;
            }
            from[i] += offset;
            to[i] += offset;
        }

        for(int i = 0; i < n; i++){
            for(int j = from[i]; j <= to[i]; j++){
                if(tileArr[j] != null){
                    if(way[i].equals("L")){ //L이면 그냥 다 흰색으로 뒤집는다. R이면 그반대. 이게 헷갈렸음.. 
                        tileArr[j].white = 1;
                        tileArr[j].black = 0;
                    }else{
                        tileArr[j].white = 0;
                        tileArr[j].black = 1;
                    }
                }else{
                    if(way[i].equals("L")){
                        tileArr[j] = new Tile(1, 0); //없으면 새걸로 넣어준다.
                    }else{
                        tileArr[j] = new Tile(0, 1);
                    }
                }
            }
        }
        int whiteCnt = 0;
        int blackCnt = 0;
        for(Tile tile : tileArr){
            if(tile != null){
                if(tile.white > 0){
                    whiteCnt++;
                }else{
                    blackCnt++;
                }
            }

        }
        System.out.print(String.format("%d %d", whiteCnt, blackCnt));
    }
}