본문 바로가기
알고리즘/코드트리

코드트리 | 구간 칠하기 / 왔다갔던 구역 [자바 java]

by 발빠진 쥐 2024. 8. 18.

 

왔다 갔던 구역 2

40XP
공유하기
보통
정답률 39% · 제출 3,017회 · 예상 소요 시간 68분
34아쉬워요
1 StarEmpty내 리스트에 추가

위치 0에서 시작하여 n번의 명령에 걸쳐 움직인 뒤, 2번 이상 지나간 영역의 크기를 출력하는 프로그램을 작성해보세요. 단 명령은 “x L“, “x R” 형태로만 주어집니다. "x L" 의 경우 왼쪽으로 x만큼 이동해야 함을, "x R"의 경우 오른쪽으로 x만큼 이동해야 함을 뜻합니다.

입력 형식

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

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

  • 1 ≤ n ≤ 100
  • 1 ≤ x ≤ 10

출력 형식

첫 번째 줄에 명령을 주어진 순서대로 수행했을 때, 2번 이상 지나간 영역의 크기를 출력합니다.

입출력 예제

예제1

입력:

6
2 R
6 L
1 R
8 L
1 R
2 R
 

출력:

6

 

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
       // 여기에 코드를 작성해주세요.

	        Scanner sc = new Scanner(System.in);

	        int offset = 100; //오프셋은 넉넉잡았음
            int a = 0; //좌표 초기값
            

	        int [] arr = new int [201];



	        int n = sc.nextInt();

	        for(int i =0; i<n; i++){
	            int x = sc.nextInt();

	            char dir = sc.next().charAt(0);
	    

	            if(dir == 'R'){

                        
                        for(int j = a; j<a+x; j++ ){ //겹치는 "구간"이니까 for문은 x1부터 x2-1까지
                            arr[j+offset]++; //겹치는 구간 칠하기
                            
                        }

                        a += x; //위치 갱신

                       

                       
	            }

                else{

                    
                        for(int j = a-1; j>=a-x; j-- ){  
                        
                        //범위 주의 : 좌표와 배열 인덱스 번호를 묶어 생각하지 않기 
                 
                        
                        
                            arr[j+offset]++;//offset을 j 범위에 더해주는게 아니라 배열 번호에 더해줘야했음..
                             
                        }

                        a -= x; //위치 갱신

                    
                        

                        
	            }

                
              

	        }




            int cnt = 0; //겹치는 구간 수

            for(int k =0; k<201; k++){

                if(arr[k]>=2){
                    cnt++;
                }

            }

            System.out.println(cnt);
        }
    }

 

 

L R 관련 if 문에서

a의 범위를 잘 생각해야됨!!

왜 + - 1 해주는지 이해가 안되면 두 코드 비교해서 보기

import java.util.*;

public class Main {
    public static void main(String[] args) {
       // 여기에 코드를 작성해주세요.

	        Scanner sc = new Scanner(System.in);

	        int offset = 100; //오프셋은 넉넉잡았음
            int a = 0; //좌표 초기값
            

	        int [] arr = new int [201];



	        int n = sc.nextInt();

	        for(int i =0; i<n; i++){
	            int x = sc.nextInt();

	            char dir = sc.next().charAt(0);
	    

	            if(dir == 'R'){

                        
                        for(int j = a+1; j<=a+x; j++ ){ //겹치는 "구간"이니까 for문은 x1부터 x2-1까지
                            arr[j+offset]++; //겹치는 구간 칠하기
                            
                        }

                        a += x; //위치 갱신

                       

                       
	            }

                else{

                    
                        for(int j = a; j>a-x; j-- ){ //offset을 j 범위에 더해주는게 아니라 배열 번호에 더해줘야했음..
                            arr[j+offset]++;
                             
                        }

                        a -= x; //위치 갱신

                    
                        

                        
	            }

                
              

	        }




            int cnt = 0; //겹치는 구간 수

            for(int k =0; k<201; k++){

                if(arr[k]>=2){
                    cnt++;
                }

            }

            System.out.println(cnt);
        }
    }