반응형

문제

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


입력

첫째 줄에 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);
    }
}
반응형
반응형

문제

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


입력

입력의 첫 줄에는 테스트 케이스의 개수 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) + " ");
            }
        }
        
        
    }
}
반응형
반응형

문제

준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.

영수증에 적힌,

  • 구매한 각 물건의 가격과 개수
  • 구매한 물건들의 총 금액

을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.


입력

첫째 줄에는 영수증에 적힌 총 금액 X가 주어진다.

둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다.

이후 N개의 줄에는 각 물건의 가격 a와 개수 b가 공백을 사이에 두고 주어진다.


출력

구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.


제한

  •  1≤X≤1000000000
  •  1≤N≤100
  •  1≤a≤1000000
  •  1≤b≤10

예제 입력

예제입력 예제출력
260000
4
20000 5
30000 2
10000 6
5000 8
Yes
250000
4
20000 5
30000 2
10000 6
5000 8
No

풀이 및 코드

-> 간단한 문제라고 생각했는데도 틀렸다고 나와서 당황했다. 알고보니 Yes, No로 출력하지않고 yes, no라고 출력해서 틀린 것이었다. 주어진 조건을 놓치지 않는 연습이 더 필요해 보인다.

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int totalPrice = Integer.parseInt(sc.nextLine()); // 총 금액
        int totalCount = Integer.parseInt(sc.nextLine()); // 총 구매종류 갯수
        
        int[] price = new int[totalCount]; // 가격 담을 변수
        int[] count = new int[totalCount]; // 갯수 담을 변수
        String judge = "No"; // 금액이 맞는지 아닌지 판단
        int sumPrice = 0;
        
        // 물건 가격과 갯수 담기
        for(int i=0;i<totalCount;i++){
            String totalTemp = sc.nextLine();
            String[] temp = totalTemp.split(" ");
            price[i] = Integer.parseInt(temp[0]);
            count[i] = Integer.parseInt(temp[1]);
            sumPrice += price[i]*count[i];
        }
        
        if(sumPrice==totalPrice){
            judge = "Yes";
        }
        
        System.out.println(judge);
        
    }
}

 

변수를 줄이고, 간결하게 리팩토링한 코드는 아래와 같다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int totalPrice = sc.nextInt(); // 총 금액
        int totalCount = sc.nextInt(); // 총 구매종류 갯수
        sc.nextLine(); // 개행문자 처리
        
        int sumPrice = 0;
        
        // 물건 가격과 갯수 계산
        for (int i = 0; i < totalCount; i++) {
            int itemPrice = sc.nextInt();
            int itemCount = sc.nextInt();
            sumPrice += itemPrice * itemCount;
        }
        
        System.out.println(sumPrice == totalPrice ? "Yes" : "No");
    }
}
반응형
반응형

문제 설명

코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.

예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.

종류 이름
얼굴 동그란 안경, 검정 선글라스
상의 파란색 티셔츠
하의 청바지
겉옷 긴 코트
  • 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
  • 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
  • 코니는 하루에 최소 한 개의 의상은 입습니다.

코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.


제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 코니가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.

입출력 예

clothes return
[["yellow_hat", headgear], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] 5
[["crow_mask", "face"],["blue_sunglasses", "face"],["smoky_makeup","face"]] 3

입출력 예 설명

 

예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.

 

1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses

 

 

예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.

crow_mask
2. blue_sunglasses
3. smoky_makeup

풀이

 

-> 먼저 hashMap에 각 의상의 종류를 담는다. 그리고 value값으로 숫자를 담는다. 같은 의상 종류가 들어오면 value값을 +1 해준다. 그렇게 담은 map을 가지고, 종류별로 갯수의 + 1 한것을 모두 곱하고 마지막에 -1 해주면 answer가 된다.


코드

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;

        HashMap<String, Integer> map = new HashMap<>();
        for(String[] type : clothes){
            if(map.containsKey(type[1])){
                map.put(type[1], map.get(type[1])+1);
            } else {
                map.put(type[1], 1);
            }
        }
        
        for(String type:map.keySet()){
            answer *= (map.get(type)+1); 
        }
        
        
        return answer-1;
    }
}
반응형
반응형

문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.


제한 사항
  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

입출력 예제

 

phone_book return
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false

입출력 예 설명

 

입출력 예 #1
앞에서 설명한 예와 같습니다.

 

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

 

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.


풀이

-> 해시를 이용해서 풀려고 했더니 어떻게 할지 처음에는 감이 잡히지 않았다. 그래서 일단 HashMap을 생성하여 phone_book의 숫자들을 key값으로 담았다. value는 모두 true로 두었다. 그 다음, 다시 반복문을 통해서 phone_book의 숫자들을 하나씩 빼서, 각 숫자들을 한 자리씩 prefix에 더하면서 접두어를 만든다. 이 접두어가 HashMap에 존재하는지 확인하면서 phone_number의 숫자와 같지 않다면 phone_number 배열 안에 한 숫자의 접두어가 존재하는 것이므로 false를 return 하고, 나머지 경우에는 true를 return한다.


코드

import java.util.HashMap;

class Solution {
    public boolean solution(String[] phone_book) {
        // 해시 맵을 생성하여 전화번호부를 저장
        HashMap<String, Boolean> phoneBookMap = new HashMap<>();
        for (String phoneNumber : phone_book) {
            phoneBookMap.put(phoneNumber, true);
        }
        
        // 각 전화번호의 접두어를 확인하여 다른 전화번호의 접두어인지 검사
        for (String phoneNumber : phone_book) {
            String prefix = "";
            for (char digit : phoneNumber.toCharArray()) {
                prefix += digit;
                // 접두어가 해시 맵에 존재하고 현재 번호가 접두어가 아닌 경우
                if (phoneBookMap.containsKey(prefix) && !prefix.equals(phoneNumber)) {
                    return false; // 접두어가 발견되었으므로 false 반환
                }
            }
        }
        
        // 모든 번호를 검사한 후에도 접두어가 발견되지 않았으면 true 반환
        return true;
    }
}
반응형

+ Recent posts