[백준] 1343번: 폴리오미노 + 1817번: 짐 챙기는 숌 + 1652번: 누울 자리를 찾아라 +1769번: 3의 배수 (Java)

won·2023년 3월 13일
0

알고리즘 문제풀이

목록 보기
24/32

백준 1343번: 폴리오미노 (Java)

https://www.acmicpc.net/problem/1343
너무 어렵게 접근한 문제
원래는 이런 길고 복잡한 코드로 풀려고 했다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class n1343 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb;
		StringBuilder result = new StringBuilder();
		ArrayList<String> ArrayList = new ArrayList<String>();
		ArrayList<String> dotList = new ArrayList<String>();

		String str = br.readLine();
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == '.') {
				sb = new StringBuilder();
				sb.append(str.charAt(i));
				while (i != str.length() - 1 && str.charAt(i + 1) == '.') {
					sb.append(str.charAt(i));
					i++;
				}
				dotList.add(sb.toString());

			}
		}

		String[] arr = str.split("[.]");
	
		int d = 0;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i].length() == 0) {
				result.append(".");
				continue;
			}
			if (arr[i].length() % 2 != 0) {
				result.setLength(0);
				result.append("-1");
				break;
			}
			if (arr[i].length() % 2 == 0) {
				if (arr[i].length() >= 4) {
					sb = new StringBuilder();
					for (int j = 0; j < arr[i].length() / 4; j++) {
						result.append("AAAA");
					}
					for (int j = 0; j < arr[i].length() % 4 - 1; j++) {
						result.append("BB");
					}

				} else {
					result.append("BB");
				}
				if(i!=arr.length-1) {
					result.append(".");
				}
			}
		}
		if (result.length() == 0) {
			result.append("-1");
		}
		bw.write(result.toString());
		bw.flush();
		bw.close();
		br.close();
	}
}

한 1~2시간 고민을 했는데 안돼서 ㅠㅠ
다른 사람 풀이를 봤는데 replace메소드를 사용하더라..
메소드를 잘 몰라서 그런 방법을 아예 생각을 안해봤다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;

public class n1343 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String str = br.readLine();
		str=polyomino(str);
		bw.write(str);
		bw.flush();
		bw.close();
		br.close();
	}
	
	public static String polyomino(String str) {
		str= str.replaceAll("XXXX", "AAAA");		
		str = str.replaceAll("XX", "BB");		
		if(str.contains("X")) {
			str="-1";
		}
		return str;
	}
}

자바 기본기를 잘 공부해둬야겠다고 생각했다.

1817번: 짐 챙기는 숌

https://www.acmicpc.net/problem/1817

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class n1817 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());

		int[] books = new int[n];

		if (n != 0) {
			st = new StringTokenizer(br.readLine());
			for (int i = 0; i < n; i++) {

				books[i] = Integer.parseInt(st.nextToken());
			}
		}
		int box = 0;
		int sum = 0;
		for (int i = 0; i < n; i++) {
			sum = 0;
			if (books[i] == 0) {
				continue;
			}
			for (int j = i; j < n; j++) {
				if (books[j] == m) {
					break;
				}
				if (books[j] != 0 &&sum+books[j]<=m ) {
					sum += books[j];
					books[j] = 0;
				}else {
					break;
				}
			}
			books[i] = 0;
			box++;
		}
		bw.write(String.valueOf(box));
		bw.flush();
		bw.close();
		br.close();
	}
}

크게 어렵진 않은 문제였다.
다만 책을 '순서대로' 넣는다는 것이 중요하다.
순서대로 넣지 못하면 break를 시키고 box의 수를 올려야 한다.

1652번: 누울 자리를 찾아라

https://www.acmicpc.net/problem/1652

이것도 아주 어렵지 않다.

...X..X.. 과 같은 패턴이 나오면
가로로 3자리가 나온다.
이런 패턴이 나올때를 대비하여 if-else문을 적절히 사용해야 할 것이다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n= Integer.parseInt(br.readLine());
		char[][] arr=new char[n][n];
		StringTokenizer st;
		String str="";
		for (int i = 0; i < n; i++) {
			str=br.readLine();
			arr[i]= str.toCharArray();
		}
	
		int count=0;
		int row=0; //세로, 열
		int col=0; //가로 , 행
		//가로 구하기
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr.length-1;j++) {
				if(arr[i][j]=='.' && arr[i][j+1]=='.') {
					if(count==0) {
						count+=2;
					}else {
						count++;
					}
				}else {
					if(count>=2) {
						col+=1;
						count=0;
					}
				}
			}
			if(count>=2) {
				col+=1;
			}
			count=0;
		}
		
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr.length-1;j++) {
				if(arr[j][i]=='.' && arr[j+1][i]=='.') {
					if(count==0) {
						count+=2;
					}else {
						count++;
					}					
				}else {
					if(count>=2) {
						row+=1;
						count=0;
					}
				}
			}
			if(count>=2) {
				row+=1;
			}
			count=0;
		}
		
		bw.write(String.valueOf(col+" "+row));
		bw.flush();
		bw.close();
		br.close();
	}
}

1769번: 3의 배수

https://www.acmicpc.net/problem/1769

이 문제는 간단해 보이지만 정해진대로 풀지 않으면 시간초과나 메모리 초과, 런타임 에러를 보기 쉽다.

이 문제는 처음에 수를 받을때 int, double형 등 Number 자료형으로 받으면 안된다.
10000000이상의 '수'가 아니라 '1000000자리 이상의 수' 이기 때문에 아주아주아주 큰 수도 들어 와 런타임에러가 나기 때문이다.
그렇기 때문에 String 형식으로 받고, 자릿수만 구해서 더해주는 형식이어야 한다.

또 한 자릿 수는 루프를 돌지 않기 때문에 count가 0이 나오도록 해주어야 한다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int sum = 0;
		int count = 0;

		String str = br.readLine();
		if (str.length() != 1) {
			while (true) {
				sum = 0;
				count++;
				for (int i = 0; i < str.length(); i++) {
					sum += str.charAt(i) - '0';
				}
				if (sum < 10) {
					break;
				}
				str = String.valueOf(sum);
			}
		}else {
			sum=Integer.parseInt(str);
		}
		bw.write(String.valueOf(count) + "\n");
		if (sum == 3 || sum == 6 || sum == 9) {
			bw.write("YES");
		} else {
			bw.write("NO");
		}

		bw.flush();
		bw.close();
		br.close();
	}
}
profile
뭐라도 하자

0개의 댓글