반응형

문제

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35


입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.


출력

첫째 줄에 10진법 수 N을 B진법으로 출력한다.


예제 입력 예제 출력
60466175 36 ZZZZZ

풀이

10진법수 K를 N진법 수로 변환하는 방법은 K를 N으로 나눈 나머지를 역순서대로 배열하는 것이다.

 


코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] temp = line.split(" ");
        int n = Integer.parseInt(temp[0]);
        int m = Integer.parseInt(temp[1]);
        String[] array = {
                "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
                "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
                "U", "V", "W", "X", "Y", "Z"
        };

        String answer = "";

        while(n/m>0){
            n=n/m;
            answer += array[n%m];
        }
        answer += array[n%m];

        System.out.println(answer);

    }
}
반응형
반응형

문제

아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다. 

이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다. 

A A B C D D
a f z z 
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x

<그림 1>

한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다. 

심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다. 

그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:

Aa0aPAf985Bz1EhCz2W3D1gkD6x

칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.


입력

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.


출력

영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다. 


 

예제 입출력

입력 출력
ABCDE
abcde
01234
FGHIJ
fghij
Aa0FfBb1GgCc2HhDd3IiEe4Jj
AABCDD
afzz
09121
a8EWg6
P5h3kx
Aa0aPAf985Bz1EhCz2W3D1gkD6x

풀이

-> Scanner로 입력을 받아서 반복문을 통해 이차원 배열에 그대로 넣어준다. 출력 할 때는 반복문의 순서만 고려해서 새로로 출력해주며, null값이나 빈값이 있는 경우 건너뛴다.


코드

 

import java.lang.reflect.Array;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[][] chars = new String[5][15];
        for(int i=0;i<5;i++){
            String line = sc.nextLine();
            String[] temp = line.split("");
            for(int j=0;j<temp.length;j++){
                chars[i][j] = temp[j];
            }
        }

        for(int j=0;j<15;j++){
            for(int i=0;i<5;i++){
                if(chars[i][j]!=null&&!chars[i][j].equals("")){
                    System.out.print(chars[i][j]);
                }
            }
        }

    }
}​

 

반응형
반응형

문제

N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.


입력

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.


출력

첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.


 

예제 입출력

입력 출력
3 3
1 1 1
2 2 2
0 1 0
3 3 3
4 4 4
5 5 100
4 4 4
6 6 6
5 6 100

 

풀이

-> 있는 그대로 반복문을 통해 입력받은 값들을 A, B 배열에 넣어준 후에 더한 값을 C에 넣어서 그대로 출력하였다.


 

코드

import java.lang.reflect.Array;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] input = sc.nextLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);

        int[][] A = new int[N][M];
        int[][] B = new int[N][M];
        int[][] C = new int[N][M];

        for(int i=0;i<N;i++){
            String line = sc.nextLine();
            for(int j=0;j<M;j++){
                String[] lineArray = line.split(" ");
                A[i][j] = Integer.parseInt(lineArray[j]);
            }
        }

        for(int i=0;i<N;i++){
            String line = sc.nextLine();
            for(int j=0;j<M;j++){
                String[] lineArray = line.split(" ");
                B[i][j] = Integer.parseInt(lineArray[j]);
            }
        }

        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                C[i][j] = A[i][j] + B[i][j];
                System.out.print(C[i][j] + " ");
            }
            System.out.println();
        }
    }
}
반응형
반응형

문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!

치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.

전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.

인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.

A+ 4.5
A0 4.0
B+ 3.5
B0 3.0
C+ 2.5
C0 2.0
D+ 1.5
D0 1.0
F 0.0

P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.

과연 치훈이는 무사히 졸업할 수 있을까?


 

입력

20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.


출력

치훈이의 전공평점을 출력한다.

정답과의 절대오차 또는 상대오차가 10−4 이하이면 정답으로 인정한다.


제한

  • 1 ≤ 과목명의 길이 ≤ 50
  • 과목명은 알파벳 대소문자 또는 숫자로만 이루어져 있으며, 띄어쓰기 없이 주어진다. 입력으로 주어지는 모든 과목명은 서로 다르다.
  • 학점은 1.0,2.0,3.0,4.0중 하나이다.
  • 등급은 A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나이다.
  • 적어도 한 과목은 등급이 P가 아님이 보장된다.

예제 입출력

입력 출력
ObjectOrientedProgramming1 3.0 A+
IntroductiontoComputerEngineering 3.0 A+
ObjectOrientedProgramming2 3.0 A0
CreativeComputerEngineeringDesign 3.0 A+
AssemblyLanguage 3.0 A+
InternetProgramming 3.0 B0
ApplicationProgramminginJava 3.0 A0
SystemProgramming 3.0 B0
OperatingSystem 3.0 B0
WirelessCommunicationsandNetworking 3.0 C+
LogicCircuits 3.0 B0
DataStructure 4.0 A+
MicroprocessorApplication 3.0 B+
EmbeddedSoftware 3.0 C0
ComputerSecurity 3.0 D+
Database 3.0 C+
Algorithm 3.0 B0
CapstoneDesigninCSE 3.0 B+
CompilerDesign 3.0 D0
ProblemSolving 4.0 P
3.284483
BruteForce 3.0 F
Greedy 1.0 F
DivideandConquer 2.0 F
DynamicProgramming 3.0 F
DepthFirstSearch 4.0 F
BreadthFirstSearch 3.0 F
ShortestPath 4.0 F
DisjointSet 2.0 F
MinimumSpanningTree 2.0 F
TopologicalSorting 1.0 F
LeastCommonAncestor 2.0 F
SegmentTree 4.0 F
EulerTourTechnique 3.0 F
StronglyConnectedComponent 2.0 F
BipartiteMatching 2.0 F
MaximumFlowProblem 3.0 F
SuffixArray 1.0 F
HeavyLightDecomposition 4.0 F
CentroidDecomposition 3.0 F
SplayTree 1.0 F
0.000000

풀이

-> 과목명은 필요없으므로, map에다가 등급과 학점값을 담아두고, Scanner를 통해서 입력받은 값의 두번째 값과 세번째 값을 가지고 총점과 총학점을 계산하였다. 오차는 어느정도 인정하기에 소수점 자릿수까지 6자리로 표현해서 출력하지는 않았다.


코드

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        HashMap<String, Double> map = new HashMap<>();
        map.put("A+",4.5);
        map.put("A0",4.0);
        map.put("B+",3.5);
        map.put("B0",3.0);
        map.put("C+",2.5);
        map.put("C0",2.0);
        map.put("D+",1.5);
        map.put("D0",1.0);
        map.put("F",0.0);

        int count = 1;
        double sum = 0;
        double gradeSum = 0; // 학점총점
        while(count<=20){
            String line = sc.nextLine().trim(); // 앞뒤 공백 제거
            String[] content = line.split(" ");
            double gradeDouble = Double.parseDouble(content[1]);
            String grade = content[2];
            if(!grade.equals("P")){
                double changedGrade = map.get(grade);
                sum += gradeDouble*changedGrade;
                gradeSum += gradeDouble;
            }
            count++;
        }
        double answer = sum/gradeSum;
        System.out.println(answer);

    }
}
반응형
반응형

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경
č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.


입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.


출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.


 예제 입출력

입력 출력
ljes=njak 6
ddz=z= 3
nljj 3
c=c= 2
dz=ak 3

풀이

-> replaceAll 메서드를 이용해서 주어진 문자열들을 입력문자열에 없는 'a'정도로 치환했다. 그 후 문자열의 길이를 구해서 리턴하려했다. 그런데 처음에는 원하는 결과가 나오지 않았다. word.replaceAll로 작성하고 word를 출력하니 입력받은 문자열이 그대로 나왔다. replaceAll 메서드는 원래의 변수자체를 수정해주는 것이 아니었다. 그래서 replaceAll한 값을 다시 word로 받아주었다.

코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine();
        String[] croAlphabet = {"c=","c-","dz=","d-","lj","nj","s=","z="};

        for(int i=0;i<croAlphabet.length;i++){
            word = word.replaceAll(croAlphabet[i],"a");
        }

        int n = word.length();
        System.out.println(n);
    }
}
반응형
반응형

문제

알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.

팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다. 

level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.


입력

첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.


출력

첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.


예제 입출력

입력 출력
level 1
baekjoon 0

풀이

-> 팰린드롬이란 거꾸로 읽어도 원래 단어와 같은 단어를 말한다. reverse 해주는 메서드를 따로 생성해서 입력 받은 단어를 뒤집어주고 서로 비교해서 같으면 1 다르면 0을 출력하면 된다.


코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine();
        String reword = reverseWord(word);
        if(word.equals(reword)){
            System.out.println("1");
        } else {
            System.out.println("0");
        }
    }

    public static String reverseWord(String word){
        String reversedWord = "";
        for(int i=word.length()-1;i>=0;i--){
            reversedWord += word.charAt(i);
        }
        return reversedWord;
    }
}

 

반응형
반응형

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.


입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.


출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.


예제 입출력

입력 출력
 5     *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

풀이

-> 이런 문제는 n 값에 따른 그림이나 숫자를 적어보면서 변화하는 부분을 보고 그 다음에 코드를 작성해본다.

위와 같이 적어보았고, 다이아몬드를 한번에 그리지 않고, 중간부분까지 큰 삼각형과 아래부분 뒤집어진 작은 삼각형을 따로 그렸다. 코드를 보면 나눠진 부분은 확인할 수 있다.


코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        sc.close();
        for(int i=0;i<num;i++){
            // start make diamond by *
            for(int j=0;j<num-i-1;j++){
                System.out.print(" ");
            }

            for(int j=0;j<2*i+1;j++){
                System.out.print("*");
            }
            System.out.println();
        }
        for(int i=num-1;i>0;i--){
            for(int j=num-i;j>0;j--){
                System.out.print(" ");
            }

            for(int j=2*i-1;j>0;j--){
                System.out.print("*");
            }
            System.out.println();
        }
    }
}
반응형
반응형

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.


출력

첫째 줄에 그룹 단어의 개수를 출력한다.


예제 입출력

입력 출력
3
happy
new
year
3
4
aba
abab
abcabc
a
1
5
ab
aa aca ba bb
4
2
yzyzy
zyzyz
0
1
z
1
9
aaa
aaazbz
babb
aazz
azbz
aabbaa
abacc
aba
zzaz
2

풀이

-> Scanner를 통해서 입력되는 첫 숫자를 n으로 받고, answer 값은 0으로 둔다. 반복문을 통해서 word를 받고, isValid를 true로 초기화해 둔다. HashMap 에 word의 문자와 자리수를 받을 수 있게 charPositions로 선언해두고, 반복문을 통해서 문자가 charPositions 안에 있으면 자릿수 떨어진 정도를 따져서 조건에 부합하면 isValid를 그대로 두고 다음 문자를 확인하고, 조건에 부합하지 않으면 isValid를 false로 변경하고 break를 통해 내부 for문을 종료한다.

 

처음에는 무조건 answer값을 올렸다가 조건에 부합하지 않으면 answer--를 통해 감소시키려 했는데, 예외가 발생해서 틀렸었다. 그래서 isValid를 추가하여 조건에 맞는지를 먼저 확인 하고 answer값을 수정하였다. 조건을 정확하게 따진 후에 결과를 바꾸도록 주의하여야겠다.


코드

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine(); // 정수 입력 후 남은 개행문자 소비
        int answer = 0;
        for(int i = 0; i < n; i++){
            String word = sc.nextLine();
            boolean isValid = true; // 단어가 조건을 만족하는지 여부
            HashMap<Character, Integer> charPositions = new HashMap<>();
            for(int j = 0; j < word.length(); j++){
                char currentChar = word.charAt(j);
                if(charPositions.containsKey(currentChar)){
                    if(j - charPositions.get(currentChar) > 1){
                        isValid = false; // 조건을 만족하지 않음
                        break;
                    }
                }
                charPositions.put(currentChar, j);
            }
            if(isValid){
                answer++; // 조건을 만족하는 경우에만 answer 증가
            }
        }
        System.out.println(answer);
    }
}
반응형

+ Recent posts