2022-모각코 5차시 활동 계획 및 결과
[ 계획 ]
1. 백준 브론즈문제 2문제 + 실버5 이상 문제 3문제 풀기 (총 5문제)
2. git으로 협업하는 방법 공부하기 (이전에 공부했지만 제대로 알지 못해 다른 사람들에게 알려주지 못하는 문제 발생)
[ 회고 ]
오늘은 백준 브론즈 2문제 + 실버 2문제 총 4문제를 풀었다. (생각보다 시간을 많이 사용했다...)
1. 브론즈2 : 공사장표지판 (23055번)
문제 : https://www.acmicpc.net/problem/23055
23055번: 공사장 표지판
신입생 백남이는 넓은 충남대학교를 돌아다니다 보니 건물을 새로 짓느라 공사를 하는 곳을 많이 보았다. 공사장은 위험한 요소들이 많아 백남이가 다칠 수도 있기 때문에 백남이가 들어가지
www.acmicpc.net
오랜만에 푸는 백준이라 머리 좀 식힐 겸 브론즈문제를 풀어보려고 했다.
그래서 우리 충남대학교에서 열었던 생각하는 프로그래밍대회 문제를 풀어봤다.
이런식으로 공사장표지판의 size를 입력받으면 그 size의 정사각형에 X표시를 하면 되는 문제다.
처음 내가 푼 방법은 아래와 같다.
package bronze2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class X_23055_0125 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
//int N = br.read(); // 표지판 사이즈
int size = sc.nextInt();
String starline = "*".repeat(size);
System.out.println(starline);
for(int i = 0 ; i < size - 2; i++){
for(int j = 0; j < size; j++){
if(j == 0 || j == size-2){
System.out.print("*");
}
System.out.print(j == i || j == size-3-i ? "*" : " ");
}
if(i != size-2) {
System.out.println();
}
}
if(size != 1) {
System.out.println(starline);
}
}
}
먼저 처음에 입력은 BufferedReader로 받아봤다. 하지만 결과는 내가 원하는대로 나오지 않았다.
아래와 같이 5보다 그 이상의 갯수만큼 *이 찍혔다.
그래서 나는 Scanner로 입력받았다. 그랬더니 내가 원하는대로 출력되었다.
하지만 백준에 제출을 했을 때는 "출력형식이 잘못되었습니다." 가 떴다.
뭐가 다른지 몰랐고, 현재까지도 무엇이 틀린지 알지 못한 상태다.
아는 분께 도움을 청해 다시 새로 코드를 작성했다.
아래는 새로 작성한 코드다.
package bronze2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class X_23055_0125 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
//int size = br.read(); // 표지판 사이즈
int size = sc.nextInt();
String[][] X = new String[size][size];
for(int i = 0 ; i < size; i++){
for(int j = 0; j < size; j++){
if(i == 0 || i == size-1 || j == 0 || j == size-1 || j == i || j == size-i-1){
X[i][j] = "*";
}
else{
X[i][j] = " ";
}
}
}
for(int i = 0 ; i < size; i++){
for(int j = 0; j < size; j++){
System.out.print(X[i][j]);
}
System.out.println();
}
}
}
이렇게 배열에 값을 입력시킨 후 반복문을 이용해 출력하니까 "출력형식이 잘못되었습니다."라는 문구 대신 "맞았습니다."라는 문구가 떴다.
이번 공사장표지판 문제를 풀면서 나는 다음에 공부해야 할 문제가 두가지가 생겼다.
1) BufferedReader를 사용해 입력받으면 왜 내가 입력받은것보다 더 많은 별이 찍히는지.
2) 내가 처음 짠 코드가 어느부분이 출력형식과 맞지 않는지.
이 두가지에 대해 공부해 볼 생각이다.
2. 브론즈3 : 별찍기-2 (2439번)
문제 : https://www.acmicpc.net/problem/2439
2439번: 별 찍기 - 2
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
www.acmicpc.net
이 문제는 처음 푼 공사장 표지판 문제를 풀다가 생각대로 잘 풀리지 않아 풀어본 문제다.
*
** 왼쪽과 같이 별을 찍으면 되는 문제다.
*** 이 문제는 2021학년도 1학년 당시 1학기때 풀었던 문제다.
**** 내가 개념을 헷갈린 것 같아 다시 풀어보았다.
*****
아래는 내가 짠 코드다.
package bronze3;
import java.util.Scanner;
public class star2_2439_0125 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for(int i = 0; i < N; i++){
System.out.print(" ".repeat(N-1-i));
System.out.print("*".repeat(i+1));
System.out.println();
}
}
}
원래 저번에 풀 때에는 이중반복문을 사용해 풀었다.
하지만 이번에는 repeat라는 방법을 알게 되었고, 그 방법을 사용해 풀어보았다.
repeat방법을 사용하니 이중for문이 아닌 단일for문으로 나오게 되었다.
코드도 더 간결하고 시간도 더 짧게 나오게 되었다.
아래는 내가 푼 방법을 비교한 사진이다.
가장 위가 오늘 풀었던 repeat방법, 가장 아래가 이중for문으로 푼 방법이다.
3. 실버5 : 방번호 (1475번)
문제 : https://www.acmicpc.net/problem/1475
1475번: 방 번호
첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
공사판표지판을 푼 다음 실버문제를 풀어보았다. 나는 이 방번호 문제가 공사판표지판 문제보다 더 쉬운 느낌이었다.
이번 방 번호 문제는 이런 문제였다. 딱 보자마자 0부터 9까지 입력받은 갯수를 센 뒤 가장 큰 값을 출력해주면 되는 문제였다. 마지막 문장에 주어진 6과 9는 뒤집어서 이용할 수 있다는 조건에서 살짝 막혔다.
입력받은 값을 하나하나 split해주어서 배열에 저장해주고 각각의 숫자를 numset이라는 배열의 index로 사용해 count를 올려주었다. 그 후 6과 9는 서로를 뒤집어서 사용할 수 있으므로 if문을 사용해 처리해 주었다.
6과 9는 숫자 한 세트 당 두개가 나올 수 있으므로 6과 9를 입력받은 개수를 더한 뒤 그 값이 2로 나누어떨어진다면 각각의 count를 2로 나누어주었고, 2로 나누어떨어지지 않는다면 각각의 count를 2로 나누어주고 1을 더해주었다. 그 후 numset이라는 count배열에 max값을 찾아 출력해주어서 방 번호 문제 클리어!
아래는 내가 작성한 코드이다.
package silver5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class room_number_1475_0125 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] num = br.readLine().split("");
int[] number = new int[num.length];
int[] numset = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 숫자 몇개나왔는지 세는 배열
for(int i = 0; i < num.length; i++) {
number[i] = Integer.parseInt(num[i]);
numset[number[i]] ++;
}
int N = numset[6] + numset[9];
if(N % 2 == 0){
numset[6] = N / 2;
numset[9] = N / 2;
}
else {
numset[6] = N / 2 + 1;
numset[9] = N / 2 + 1;
}
int max = 0;
for(int i = 0; i < 10; i++){
if(max < numset[i]){
max = numset[i];
}
}
System.out.println(max);
br.close();
}
}
4. 실버5 : 뒤집기 (1439번)
문제 : https://www.acmicpc.net/problem/1439
1439번: 뒤집기
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모
www.acmicpc.net
마지막은 문자열 문제인 뒤집기문제이다.
이 문제는 입력값으로 0과 1만 들어오기 때문에 나는 숫자가 바뀌는 횟수로 초점을 맞춰 해결하였다.
가장 처음 입력받은 문자를 기준문자로 해서 순차적으로 비교를 하였다.
기준문자와 비교를 해 같지 않으면 count를 1 올리고 기준문자를 현재의 문자로 바꿔주었다.
이렇게 끝까지 비교를 하면 count값이 나오게 된다.
여기서 한번 더 생각해봐야 한다.
1) 만약 "0000011000" 을 입력받게 된다면 숫자가 바뀌는 횟수는 2번이지만 다솜이가 해야하는 행동의 최소 횟수는 이 된다. 그렇기 때문에 이부분에 대한 조건은 따로 if문을 만들어 처리해주었다.
2) 만약 "1010101" 을 입력받으면 바뀐횟수는 6번이지만 최소행동횟수는 3이다.
또한 "10101010"을 입력받으면 바뀐횟수는 7번이지만 최소행동횟수는 4다.
따라서 1)번 조건을 제외한 나머지 값에 대해서 count가 2로 나누어 떨어진다면 count / 2를 출력, 2로 나누어 떨어 지지 않는다면 count / 2 + 1을 출력하는 조건문을 만들어 처리해주었다.
이렇게 해서 뒤집기 문제도 해결했다.
아래는 내가 푼 코드이다.
package silver5;
import java.util.*;
public class reverse_1439_0125 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String[] str = sc.nextLine().split("");
String compare = str[0];
int count = 0;
for(int i = 0; i < str.length; i++){
if(!str[i].equals(compare)){
count++;
compare = str[i];
}
}
if(count == 0 || count == 1) {
System.out.println(count);
}
else{
System.out.println(count % 2 == 0 ? count / 2 : count / 2 + 1);
}
}
}