문제

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다.

하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다.

종말의 숫자란 어떤 수에 6이 적어도 3개이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 과 같다.

따라서, 숌은 첫 번째 영화의 제목은 세상의 종말 666, 두 번째 영화의 제목은 세상의 종말 1666 이렇게 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 숫자) 와 같다.

숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.

입력

첫째 줄에 숫자 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.

 

나의 풀이

 어떤 자리에든 연속으로 666이 나오면 주어진 숫자를 1씩 감소시킨다. 0이 되는 순간의 현재 숫자를 반환하기로.

 관건은 연속으로 666이 나오는지를 어떻게 체크 할 것인가인데, 현재 숫자가 666이상일 경우 1천으로 나눈 나머지를 구해서 검사하기로 했다. 일치않지 않을 땐 1의 자리를 잘라내고(현재 숫자를 10으로 나눈 몫) 다시 1000으로 나눈 나머지를 검사하는 작업을 반복했다.

 

 

코드

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

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 num = Integer.parseInt(br.readLine());
        int counter = 665;
        while(num>0) {
            counter++;
            num -= checkNum(counter);
        }
        
        bw.write(counter+"\n");
        bw.flush();
    }
    
    static int checkNum(int n) {
        while(n>=666) {
            if(n%1000==666) {
                return 1;
            } else {
                n /= 10;
            }
        }
        return 0;
    }
}

 공부 내용을 블로그에 저장하려다가 뭔가 깔끔한 느낌이 아니고 은근 입력이 불편해서 그만 두었었다.

결과적으론 공부나 리뷰, 프로젝트 등을 하면서 남는 코드와 도큐먼트의 저장 매체가 github, 노션, 애버노트, 슬랙 등등 너무 다양해져서 찾아보는 것도 일이다 느껴 블로그에 저장하기로 했다. 모바일에서나 어디서든 앱보다 접근성도 훨씬 좋으니 꾸준히 기록해 봐야지.

 다른 매체에 저장되어있는 문서들을 전부 옮기고 싶긴 한데 양이 많다보니 한꺼번에 하기엔 무리가 있을거 같다. 시간 날때마다 조금씩 옮기기로 하고, 새롭게 공부하거나 기록할 내용은 매일 올려보도록 노력해야 봐야지.

'기타' 카테고리의 다른 글

프로젝트1. Riding Cafe 홈페이지  (0) 2020.08.09

문제 풀이

  1시간이 60분이고, 분단위가 0미만이거나 60초과이면 시단위의 값과 함께 변경해주는 것이 포인트

 시간뿐 아니라 날짜나 기타 닫힌 범위 안에서 계산은 대체로 동일한 것 같다.

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int h,m;
        h = sc.nextInt();
        m = sc.nextInt();
        m-=45;
        
        if(m<0) {
            m+=60;
            h--;
        }
        if(h<0) {
            h+=24;    
        }
        
        System.out.println(h+" "+m);
        
        sc.close();
    }
}

'Baekjoon-Algorithm' 카테고리의 다른 글

백준 10172 강아지 풀이  (0) 2020.08.10
백준 10171 고양이 풀이  (0) 2020.08.10
백준 1018 체스판 풀이  (0) 2020.08.10
백준 7568 덩치 풀이  (0) 2020.08.10
백준 2231 브루트 포스 분해합 풀이  (0) 2020.08.09

문제 풀이

 고양이 문제와 동일하다. 특문 출력이 포인트.

 

public class Main {
    public static void main(String[] args) {
        System.out.println("|\\_/|");
        System.out.println("|q p|   /}");
        System.out.println("( 0 )\"\"\"\\");
        System.out.println("|\"^\"`    |");
        System.out.println("||_/=\\\\__|");
    }
}

'Baekjoon-Algorithm' 카테고리의 다른 글

백준 2884 알람시계 풀이  (0) 2020.08.10
백준 10171 고양이 풀이  (0) 2020.08.10
백준 1018 체스판 풀이  (0) 2020.08.10
백준 7568 덩치 풀이  (0) 2020.08.10
백준 2231 브루트 포스 분해합 풀이  (0) 2020.08.09

문제 풀이

 포인트는 특수문자 출력에 있다. 코드 아래 링크는 정리 페이지로 이동.

 

코드

public class Main {
    public static void main(String[] args){
        System.out.println("\\    /\\");
        System.out.println(" )  ( \')");
        System.out.println("(  /  )");
        System.out.println(" \\(__)|");
    }
}

 

https://coder9084.tistory.com/39

 

특수 문자 출력

대부분에 언어에서 일부 특수문자는 그 자체로 기능이 이미 있기 때문에 대체되는 패턴(리터럴)으로 해당 특수문자를 출력할 수 있도록 기능을 제공한다.  Java에서 특수 문자 출력은 아래와 같�

coder9084.tistory.com

 

'Baekjoon-Algorithm' 카테고리의 다른 글

백준 2884 알람시계 풀이  (0) 2020.08.10
백준 10172 강아지 풀이  (0) 2020.08.10
백준 1018 체스판 풀이  (0) 2020.08.10
백준 7568 덩치 풀이  (0) 2020.08.10
백준 2231 브루트 포스 분해합 풀이  (0) 2020.08.09

대부분에 언어에서 일부 특수문자는 그 자체로 기능이 이미 있기 때문에 대체되는 패턴(리터럴)으로 해당 특수문자를 출력할 수 있도록 기능을 제공한다.

 Java에서 특수 문자 출력은 아래와 같다.

 

특수문자 리터럴
Tab \t
Backspcae \b
줄 바꿈 \n
Carriage Return \c
Form Feed \f
\(역슬레쉬) \\
작은 따옴표( ' ) \'
큰 따옴표( " ) \"
16진수 유니코드 문자 \u유니코드
   
   

 

*Carriage Return

  캐리지 리턴은 포인터를 현재 라인에서 젤 앞으로 보내는 명령으로 Window에서 키보드 Home 버튼을 누르는 것과 같다.

 

**Form Feed

  폼피드는 서식제어 문자의 하나로서, 대개 연속용지를 사용하는 프린터에서 폼피드 단추를 누르거나 이에 해당하는 명령을 프린터에 보내면 연속용지가 다음 페이지의 시작 부분으로 넘겨진다. 아스키 문자셋을 사용하는 시스템에서, 프린터가 용지의 한 페이지 길이에 해당하는 만큼 페이지를 넘기거나 다음 페이지의 제일 첫 부분으로 넘기게 하는 특수문자는 십진수 12에 해당하는 값이다. (출처 http://www.terms.co.kr/formfeed.htm )

  

 

 

 

문제

지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M*N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8*8 크기의 체스판으로 만들려고 한다.

체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.

보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8*8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

출력

첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.

 

나의 풀이

 주어지는 조건을 보면 주어지는 보드에서  8*8 크기의 보드를 잘라내어야 하고, 보드의 시작점은 블랙이나 화이트 모두 가능하다. 여기서 시작해서 일단 주어지는 보드에서 8*8 크기로 잘라낼 수 있는 범위를 생각해 보았다.  x> n-8, y>m-8  의 조건이 만족하는 범위 내에서 보드의 시작점을 정해야 한다 생각하고, 잘라낸 보드를 완성형태의 체스판과 한 포인트씩 비교하며 다시 색칠하는 횟수를 구하는 함수를 작성하였다. 문제는 완성형태의 체스판을 따로 만들지 않고 각 포인트마다 위치에 따라 색칠을 해야할지 말아야 할지를 판정하려 시도하였는데, 코드를 작성하다 보니 이러한 방식으로는 매 포인트마다 2회의 if문을 반듯이 사용해야 했다. 결국 완성형 체스판을 미리 만들어 두는 것이 효율적이라 판단, 체스판의 시작점이 블랙/화이트 모두 올 수 있음을 감안해 두 가지 형태의 완성형 체스판(wbBord, bwBord)을 구현하였다. 

 주어진 보드에서 8*8 보드를 잘라내고 두 가지의 완성형 체스판과 비교해보며 필요한 색칠 횟수를 리턴시키고, 가장 작은 값을 구해 출력하였다.

 

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

public class Main {
    static char[][] wbBord;
    static char[][] bwBord;
    
    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 = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        
        wbBord = new char[8][8];
        bwBord = new char[8][8];
        for(int i=0; i<8; i++) {
            for(int j=0; j<8; j++) {
                if(i%2==0) {
                    if(j%2==0) {
                        wbBord[i][j] = 'W';
                        bwBord[i][j] = 'B';
                    } else {
                        wbBord[i][j] = 'B';
                        bwBord[i][j] = 'W';
                    }
                } else {
                    if(j%2==0) {
                        wbBord[i][j] = 'B';
                        bwBord[i][j] = 'W';
                    } else {
                        wbBord[i][j] = 'W';
                        bwBord[i][j] = 'B';
                    }
                }
            }
        }
        
        
        char[][] bord = new char[n][m];
        for(int i=0; i<n; i++) {
            String str = br.readLine().trim();
            for(int j=0; j<m; j++) {
                bord[i][j] = str.charAt(j);
            }
        }
        
        int min = 8*8;
        int temp;
        for(int i=0; i<=n-8; i++) {
            for(int j=0; j<=m-8; j++) {
                temp = checkPoint(bord, i, j);
                if(temp<min)
                    min = temp;
            }
        }
        
        
        bw.write(min+"\n");
        bw.flush();
    }
    
    public static int checkPoint(char[][] bord, int beginY, int beginX) {
        int counterWB = 0;
        int counterBW = 0;
        for(int i=beginY; i<beginY+8; i++) {
            for(int j=beginX; j<beginX+8; j++) {
                if(bord[i][j]!=wbBord[i-beginY][j-beginX]) counterWB++;
                if(bord[i][j]!=bwBord[i-beginY][j-beginX]) counterBW++;
            }
        }
        if(counterWB<counterBW)
            return counterWB;
        else
            return  counterBW;
    }
}

문제

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x,y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x,y), (p,q)라고 할 때 x>p 그리고 y>q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56,177), (45,165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55,173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, "덩치"로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.

N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.

이름<몸무게, 키>덩치 등수

A <55, 185> 2
B <58, 183> 2
C <88, 186> 1
D <60, 175> 2
E <46, 155> 5

위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.

입력

첫 줄에는 전체 사람의 수 N이 주어진다. 그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다. 단, 2 ≤ N ≤ 50, 10 ≤ x,y ≤ 200 이다.

출력

여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 단, 각 덩치 등수는 공백문자로 분리되어야 한다.

 

 

나의 풀이

 먼저 접근방법으로 모든 키와 몸무게 순위를 배열로 저장하고, 다른 사람과 비교해서 순위를 조절하기로 했다.

 순위를 먼저 모두 1로 두고, 반복문을 통해 다른 사람과 비교시 나보다 키와 몸무게가 모두 더 나간다면 순위 값을 1씩 증가 시켰다. 

 

 

코드 전문

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

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 num = Integer.parseInt(br.readLine());
        StringTokenizer st;
        
        int[][] arr = new int[num][3];
        
        for(int i=0; i<num; i++) {
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
            arr[i][2] = 1;
        }
        
        for(int i=0; i<num; i++) {
            for(int j=0; j<num; j++) {
                if(i==j) continue;
                if(arr[i][0]<arr[j][0] && arr[i][1]<arr[j][1]) {
                    arr[i][2]++;
                }
            }
        }
        
        for(int i=0; i<num; i++) {
            bw.write(arr[i][2]+" ");
        }
        
        bw.flush();
    }
}

+ Recent posts