[구름톤 챌린지 4주 차 학습 일기] 18일차 미션 문제 18. 중첩 점 (java)
Problem Solving/goorm

[구름톤 챌린지 4주 차 학습 일기] 18일차 미션 문제 18. 중첩 점 (java)

728x90

https://level.goorm.io/exam/195700/%EC%A4%91%EC%B2%A9-%EC%A0%90/quiz/1

 

구름LEVEL

난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다.

level.goorm.io


728x90

 

내 생각

22번 테스트케이스만 fail이 떠서 문제 풀이는 잘한 거 같은데 어떤 예외 상황이 있을지 고민해 봤다.

한 칸에 생기는 중첩 점들의 개수는 세로 선 x 가로 선인데, 한 칸에 세로 선 5만 개, 가로 선 5만 개가 있다면 중첩 점은 int 자료형을 넘어가게 된다.

따라서 중첩 점 개수를 담는 자료형을 int에서 long로 해줘야 22번 테스트케이스를 통과할 수 있다.


import java.io.*;
import java.util.*;

class Main {
	
	static int N;
	static long[][][] map;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		// 정사각형의 크기 N과 반직선의 개수 M 입력
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		// 정사각형 정보 입력
		map = new long[N + 1][N + 1][2]; // map[i][j][0] := (i, j)의 가로선 개수, map[i][j][1] := (i, j)의 세로선 개수
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			String d = st.nextToken();
			line(x, y, d);
		}
		
		// 점 개수 구하기
		long count = 0;
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= N; j++) {
				count += map[i][j][0] * map[i][j][1];
			}
		}
		
		// 출력
		System.out.println(count);
	}
	
	static private void line(int x, int y, String d) {
		if(d.equals("U")) {
			for(int i = 1; i <= x; i++) map[i][y][1]++;
		} else if(d.equals("D")) {
			for(int i = x; i <= N; i++) map[i][y][1]++;
		} else if(d.equals("L")) {
			for(int i = 1; i <= y; i++) map[x][i][0]++;
		} else if(d.equals("R")) {
			for(int i = y; i <= N; i++) map[x][i][0]++;
		}
	}
}
728x90