반응형

문제

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

크로아티아 알파벳변경
č 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();
        }
    }
}
반응형
반응형

업무중에 날짜가 들어가는 데이터들이 생성될 때, 요일이 지정된 데이터들도 있지만 없을 경우에는 날짜데이터만으로 요일 데이터가 필요한 순간이 있었다. mysql에서는 날짜데이터로 요일을 조회할 수 있을까? 찾아보니 DATE_FORMAT을 통해서 가능했다. 코드는 아래와 같다.

 

코드

SELECT DATE_FORMAT('2024-03-20', '%W') AS weekday;
-- 출력 결과 : Wednesday

SELECT DATE_FORMAT('2024-03-20', '%a') AS weekday;
-- 출력 결과 : Wed

 

이를 이용해서 case문을 작성하면 한글로 요일데이터를 출력할 수 있다.

반응형
반응형

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, 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);
    }
}
반응형
반응형

문제

문자열을 입력으로 주면 문자열의 첫 글자와 마지막 글자를 출력하는 프로그램을 작성하시오.


입력

입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 한 줄에 하나의 문자열이 주어진다. 문자열은 알파벳 A~Z 대문자로 이루어지며 알파벳 사이에 공백은 없으며 문자열의 길이는 1000보다 작다.


출력

각 테스트 케이스에 대해서 주어진 문자열의 첫 글자와 마지막 글자를 연속하여 출력한다.


입출력 예제

입력 출력
3
ACDKJFOWIEGHE
O
AB
AE
OO
AB

풀이

 

-> 간단한 문제이지만 생각해보고 넘어갈 부분이 있어서 기록을 남긴다. 처음 입력 받은 숫자만큼 문자열을 받고 해당 문자열의 첫번째 문자와 마지막 문자를 +해서 출력하면 된다고 생각했다. 하지만 +로 문자를 더하면 문자의 유니코드 값이 더해지기 때문에 유니코드 값이 출력된다. 따라서 문자를 더해서 문자열로 받고 싶다면 중간에 빈 문자열 ""을 더해주면 된다. 


코드

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        sc.nextLine();
        
        String[] word = new String[count];
        for(int i=0;i<count;i++){
            word[i]=sc.nextLine();
            int n = word[i].length();
            System.out.println(word[i].charAt(0) +""+ word[i].charAt(n-1));
        }        
        
    }
}
반응형
반응형

문제

단어 S와 정수 가 주어졌을 때, 번째 글자를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 영어 소문자와 대문자로만 이루어진 단어 가 주어진다. 단어의 길이는 최대 1000이다.

둘째 줄에 정수 가 주어진다. (1≤i≤|)


출력

번째 글자를 출력한다.


입출력 예제

입력 출력
Sprout
3
r
shiftpsh
6
p
Baekjoon
4
k

풀이

 

-> String 문자열의 n번째 순서의 문자는 charAt(n-1)을 통해서 구할 수 있다.


코드

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine();
        int n = sc.nextInt();
        System.out.println(word.charAt(n-1));
    }
}
반응형
반응형

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.


입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.


출력

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.


예제

입력 출력

3
1
4
5
7
9
6
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

2
8
9
30
6
12
10
20
21
11
7
5
28
4
18
29
17
19
27
13
16
26
14
23
22
15
3
1
24
25
2
8

 


풀이

 

-> 크기가 30인 배열을 만들어 둔 후, 28개의 숫자를 자기자신의 -1인 index를 가지는 배열의 값으로 둔다. 그러면 30개의 배열값 중에서 2개는 값이 0인 상태가 된다. 반복문을 통해서 배열의 값이 0이면 해당 index값에 +1을 해서 출력한다.


코드

 

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] array = new int [30];
        
        for(int i=0;i<28;i++){
            int number = sc.nextInt();
            array[number-1] = number;
        }
        
        for(int i=0; i<30; i++){
            if(array[i]==0){
                System.out.println((i+1) + " ");
            }
        }
        
        
    }
}
반응형

+ Recent posts