잡다한 배똥월드

728x90

 

 

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

 

 

N×N 크기의 격자판이 있다. 각각의 격자는 비어 있거나(‘.’), 막혀 있다(‘#’). 이때, 막혀 있는 칸들이 하나의 정사각형을 이루는지를 판단하는 프로그램을 작성하라.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 격자판의 크기 N (1≤N≤20 이 주어진다. 다음 N개의 줄은 격자판의 배치를 나타내며, 각 줄에는 ‘.’ 또는 ‘#’로만 이루어진 길이가 N인 문자열이 주어진다. 모든 격자판에는 최소 1개 이상의 ‘#’ 칸이 있음이 보장된다.

[출력]
각 테스트 케이스마다 격자판의 막혀 있는 칸들이 하나의 정사각형을 이루면 ‘yes’를, 그렇지 않다면 ‘no’를 출력한다.

 

 

 

 

 

 

 

작성 코드

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

class Solution {
	public static void main(String args[]) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		int T = Integer.parseInt(br.readLine());
        
		for(int test_case = 1; test_case <= T; test_case++) {
			int n = Integer.parseInt(br.readLine());
            
            String[][] map = new String[n][n];
            int firstR = -1;
            int firstC = -1;
            int count = 0;
            String answer = "yes";
            
            for (int i = 0; i < n; i++) {
            	String s = br.readLine();
                String[] arr = s.split("");
                
                map[i] = Arrays.copyOf(arr, arr.length);
                count += s.replace(".", "").length();
                
                if (firstR == -1 && firstC == -1 && s.indexOf("#") != -1) {
                	firstR = i;
                    firstC = s.indexOf("#");
                }
            }
            
            int size = 0;
            
            for (int i = 1; i <= n; i++) {
            	if (i * i == count) {
                    size = i;
                    break;
                }
            }
            
            if (size == 0 || firstR + size > n || firstC + size > n) {
                System.out.printf("#%d %s%n", test_case, "no");
                continue;
            }
            
            loop:
            for (int i = firstR; i < firstR + size; i++) {
                for (int j = firstC; j < firstC + size; j++) {
                    if (!map[i][j].equals("#")) {
                        answer = "no";
                        break loop;
                    }
                }
            }
            
            System.out.printf("#%d %s%n", test_case, answer);
		}
	}
}

 

 

 

 

어차피 #들이 다 붙어있어야 하기 때문에 처음 시작하는 행, 열 좌표를 구했고,

아래의 경우를 예를 들면 가로 세로 길이를 구할 땐 2로 나올 것이다.

근데 첫 시작 지점이 (0, 2)이기 때문에 범위 오류가 나기 때문에

만약에 첫 시작 지점에서 가로 세로로 갈 수 없으면 그냥 no 리턴.

 

 

 

 

 

 

 

모양에 대해서는 여러 경우의 수가 있기 때문에

다양한 모양을 생각해서 코드를 짜야만 했다.

 

 

 

 

 

 

 

 

풀고 난 지금에서야 코드를 보면 간단하다고 생각이 들지만

경우의 수를 생각하는 게 조금 어려웠다....

 

거즘 4번만에 통과한...

 

 

 

 

 

728x90
728x90

 

 

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

 

 

주어진 정수의 앞 두 자리를 유효숫자로 하여 표기하는 프로그램을 작성하세요.
예를 들어 정수 588235는 5.88235*105 인데, 앞의 소수 부분을 소수점 두 번째 자리에서 반올림하여 5.9*105로 나타내는 것입니다.
 

하나의 예외로, 9999 같은 경우 9.999*103에서 9.999의 소수점 두 번째 자리를 반올림하여 1.0*104으로 나타내야 합니다.



 

 

 

 

 

 

작성 코드 : 

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

class Solution {
	public static void main(String args[]) throws IOException {  
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());

		for(int test_case = 1; test_case <= T; test_case++){

            String n = br.readLine();
            int num = Integer.parseInt(n.substring(0, 3));
            int l = n.length() - 1;
            
           	double r = Math.round(num / 10.0) / 10.0;
            
	        if (r >= 10) {
                r /= 10;
                l++;
            }
            
            System.out.printf("#%d %.1f*10^%d%n", test_case, r, l);

		}
	}
}

 

 

 

 

 

접근 방식은 다음과 같다.

 

 

 

 

 

처음에는 숫자의 길이를 가져와서 1을 빼면 10의 몇 승인지 파악할 수 있겠다고 생각했다.

그래서 가져올 때 바로 정수형 변환을 하지 않고 String으로 가져온 후에 Integer.parseInt()를 했다.

이 때, 어차피 소수점 두번째 자리에서 반올림을 할거라서 나머지 뒷 자리는 필요가 없을 뿐더러 4번째 테스트 케이스는 어차피 integer 범위에 들지 않기 때문에 substring으로 앞에서부터 숫자 세 개만 자른 후 형 변환을 했다.

 

 

 

그리고 나서 Math.round로 반올림을 해주는데, 

이 때 Math.round는 소수점 첫번째 자리에서 반올림을 해주는 녀석이다.

 

 

 

테스트 케이스 4번으로 예를 들자면 현재 정수형으로 변환된 것이 602이다.

602의 1의 자리의 숫자가 소수점 두번째 자리의 숫자이기 때문에 60.2의 모습을 만들어서 Math.round()를 하면 되기 때문에 10.0으로 나눠주었다.

참고로 10으로 나누면 애시당초에 602 역시 정수형이고 10도 정수형이기 때문에 소수점 이하의 숫자들이 그냥 없어지기 때문에 10.0으로 나눠 실수형으로 리턴될 수 있게 했다.

마찬가지로 Math.round(602 / 10.0)을 하면 60이 리턴이 되는데, 리턴값은 6.0이 되어야 하니까 또 10.0으로 나눠줬다.

 

 

 

 

그리고 나서 테스트 케이스 2번과 같이 999 의 경우에는 리턴값이 10.0이 된다.

그래서 만약 리턴값이 10보다 크거나 같으면 또 10으로 나누고, 10의 몇 승인지 구해놓은 자리 수 역시 1을 더해준다.

 

 

 

 

마지막으로 출력 형식이 정해져 있기 때문에 System.out.println()으로 하나하나 작성하는 것보다는

System.out.printf() 이용하는 것이 편하기 때문에 이를 통해서 출력해주었다.

 

 

 

 

728x90

+ Recent posts