# 문제 출제 사이트

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

 

# 문제

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.

  1. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
  2. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.

예를 들어 Queue에 4개의 문서(A B C D)가 있고, 중요도가 2 1 4 3 라면 C를 인쇄하고, 다음으로 D를 인쇄하고 A, B를 인쇄하게 된다.

여러분이 할 일은, 현재 Queue에 있는 문서의 수와 중요도가 주어졌을 때, 어떤 한 문서가 몇 번째로 인쇄되는지 알아내는 것이다. 예를 들어 위의 예에서 C문서는 1번째로, A문서는 3번째로 인쇄되게 된다.

 

# 입력

첫 줄에 테스트케이스의 수가 주어진다. 각 테스트케이스는 두 줄로 이루어져 있다.

테스트케이스의 첫 번째 줄에는 문서의 개수 N(1 ≤ N ≤ 100)과, 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수 M(0 ≤ M < N)이 주어진다. 이때 맨 왼쪽은 0번째라고 하자. 두 번째 줄에는 N개 문서의 중요도가 차례대로 주어진다. 중요도는 1 이상 9 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.

 

# 출력

각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 테스트케이스의 수를 입력 받는다.
        int t= Integer.parseInt(br.readLine());
        
        // 문서의 개수(n), 몇번째로 인쇄되었는지 궁금한 문서(m)의 줄을 입력받을 StringTokenizer
        StringTokenizer st1;
        
        // 문서들의 중요도를 입력받을 StringTokenizer
        StringTokenizer st2;
        
        // 테스트 케이스의 수가 0이 될때까지 반복
        while (t-- > 0) {
            st1 = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st1.nextToken());
            int m = Integer.parseInt(st1.nextToken());
            
            // Queue<int[]>를 LinkedList<>로 구현
            Queue<int[]> queue = new LinkedList<>();
            
            // 문서의 중요도의 줄을 입력받는다.
            st2 = new StringTokenizer(br.readLine());
            
            // queue에 int배열로 인덱스(j)와 문서의 중요도를 접어넣는다.
            for (int j = 0; j < n; j++) {
                queue.offer(new int[] { j, Integer.parseInt(st2.nextToken()) } );
            }
            
            // 문서가 몇번째로 인쇄되는지 입력할 정수
            int count = 0;
            
            // queue가 빈값이 아니면 반복문 진행
            while (!queue.isEmpty()) {
            
            	// poll()을 사용해 queue의 맨 앞에 있는 값을 꺼내고 해당 값을 지운다.
                int[] front = queue.poll();
                
                // front 배열의 첫번째 값이 최대값이 아닌지 확인하기 위해 선언한 boolean
                boolean isMax = true;
                
                // queue를 반복문을 돌려 안에 있는 int배열의 값을 확인한다.
                for (int[] q : queue) {
                
                	// q[1]의 문서의 중요도가 맨 앞에 있는 문서보다 중요도가 높으면 조건문 실행
                    if (front[1] < q[1]) {
                    	// 맨 앞에 있는 문서의 중요도가 최대값이 아니므로 false
                        isMax = false;
                        // 맨 앞에 있는 값을 맨 뒤로 보내기 위해 for문 종료
                        break;
                    }
                }
                
                // 맨 앞에 있는 값이 최대값이면 count 정수 + 1
                if (isMax) {
                    count++;
                    // 맨 앞에 있는 값의 인덱스가 m과 값으면 while문 종료
                    if (front[0] == m) break;
                } else {
                
                	// 맨 앞에 있는 값을 제일 뒤로 추가한다.
                    queue.offer(front);
                }
            }
            System.out.println(count);
        }
    }
}
  • Queue는 인터페이스로만 제공되어서 따로 구현체를 사용해줘야 한다.
    => 인텔리제이에서 추천해주는 LinkedList<> 를 사용했다.
  • Queue 인터페이스는 Collection 인터페이스를 확장해서 add(), remove(), element() 메소드를 사용할 수 있다.
    하지만 add()는 큐가 꽉 차면 illegalStateException 에러가 발생하므로 add() 대신 offer()를 사용하자.
    => offer() : 데이터를 저장할 때 사용
    => poll() : 가장 앞에 있는 데이터를 꺼내고, 지운다.
    => peek() : 가장 앞에 있는 데이터를 꺼내기만 하고, 지우지는 않는다.

 

# 참고자료

  • 블로그 <코딩 공부 일지> => 링크
  • 블로그 <Stranger's LAB> => 링크
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/2420

 

2420번: 사파리월드

첫째 줄에 두 도메인의 유명도 N과 M이 주어진다. (-2,000,000,000 ≤ N, M ≤ 2,000,000,000)

www.acmicpc.net

 

# 문제

사파리월드는 인터넷으로만 존재하는 미스테리한 나라이다.

사파리월드에는 2개의 서브도메인이 seunghwan.royal.gov.sw와 kyuhyun.royal.gov.sw 이 있는데,

이것이 couple.royal.gov.sw으로 합쳐질 것이다.

그러나 도메인 관리 센터 SWNIC(센터장: 김동규)에는 엄격한 룰이 있다.

두 서브도메인을 합칠 때, 유명도의 차이가 너무 차이나지 않을 경우에만 두 서브도메인을 결혼시키는 것이다.

서브도메인의 유명도는 정수이다.

두 서브도메인의 유명도가 주어졌을 때, 그 차이를 구하는 프로그램을 작성하시오.

 

# 입력

첫째 줄에 두 도메인의 유명도 N과 M이 주어진다. (-2,000,000,000 ≤ N, M ≤ 2,000,000,000)

 

# 출력

첫째 줄에 두 유명도의 차이 (|N-M|)을 출력한다.

 

 

# 제출한 소스코드

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Long n = Long.parseLong(st.nextToken());
        Long m = Long.parseLong(st.nextToken());

        Long result;
        if (n < 0) {
            result = -n + m;
        } else if (m < 0) {
            result = n + -m;
        } else {
            result = -n + -m;
        }

        System.out.println(result);
    }
}
  • n이 음수이면 처리하는 경우의 수와 m이 음수일 때 경우의 수를 처리하는 방식으로 접근했었다.
    else에 둘 다 음수일 때 처리하는 방법을 추가했었다.
  • 너무 복잡하게 생각하고 있었고 문제에 정답에 대한 해답이 있었는데 제대로 파악하지 못했다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Long n = Long.parseLong(st.nextToken());
        Long m = Long.parseLong(st.nextToken());

        Long result = 0L;
        if (n < 0 && m < 0) {
            result = -n - -m;
        } else if (n < 0) {
            result = -n + m;
        }else if (m < 0) {
            result = n + -m;
        }

        System.out.println(result);
    }
}
  • n과 m이 둘 다 음수일 때 처리하는 경우의 수를 다시 생각해서 수정한 조건문이다.
    역시나 틀렸다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Long n = Long.parseLong(st.nextToken());
        Long m = Long.parseLong(st.nextToken());

        Long result = n - m;
        if (result < 0) {
            result = -result;
        }
        
        System.out.println(result);
    }
}
  • 입력되는 값이 범위가 -2,000,000,000 ≤ N, M ≤ 2,000,000,000 이기 때문에 Long으로 파싱 후 값을 할당한다.
  • n - m 의 값을 출력하면 된다.
  • result가 음수이면 양수로 바꿔서 출력하게 한다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Long n = Long.parseLong(st.nextToken());
        Long m = Long.parseLong(st.nextToken());

        Long result = n - m;

        System.out.println(result < 0 ? -result : result);
    }
}
  • 3항 연산자를 사용해서 코드를 간추려봤습니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Long n = Long.parseLong(st.nextToken());
        Long m = Long.parseLong(st.nextToken());
        System.out.println(n - m < 0 ? -(n - m) : n - m);
    }
}
  • result에 값을 할당 안하고 바로 연산을 해서 출력하도록 해봤습니다.
  • 코드 라인수는 줄었지만 가독성이 안좋아보이네요.
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/15964

 

15964번: 이상한 기호

부산일과학고등학교의 효진이는 수학의 귀재이다. 어떤 문제라도 보면 1분 내에 풀어버린다는 학교의 전설이 내려올 정도였는데, 이런 킹ㅡ갓 효진에게도 고민이 생겼다. 대부분의 문제에서 반

www.acmicpc.net

 

# 문제

부산일과학고등학교의 효진이는 수학의 귀재이다. 어떤 문제라도 보면 1분 내에 풀어버린다는 학교의 전설이 내려올 정도였는데, 이런 킹ㅡ갓 효진에게도 고민이 생겼다. 대부분의 문제에서 반복되는 연산이 있었기 때문이다! 이 연산은 너무 길어서 종이에 풀던 효진이는 너무 고통스러워서, 자신이 새로 연산자를 만들기로 했다.

연산자의 기호는 @으로, A@B = (A+B)×(A-B)으로 정의내리기로 했다.

하지만, 효진이는 막상 큰 숫자가 들어오자 계산하기 너무 귀찮아졌다.

효진이를 도와 정수 A, B가 주어지면 A@B를 계산하는 프로그램을 만들어주자!

 

# 입력

첫째 줄에 A, B가 주어진다. (1 ≤ A, B ≤ 100,000)

 

# 출력

 첫째 줄에 A@B의 결과를 출력한다.

 

 

# 제출한 소스코드

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        System.out.println((a + b) * ( a - b ));
    }
}
  • 자료형을 int로 사용해서 30점이 나왔습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Long a = Long.parseLong(st.nextToken());
        Long b = Long.parseLong(st.nextToken());

        System.out.println((a + b) * ( a - b ));
    }
}
  • Long으로 변경하니까 100점을 맞았습니다.
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/11718

 

11718번: 그대로 출력하기

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시

www.acmicpc.net

 

 

# 문제

입력 받은 대로 출력하는 프로그램을 작성하시오.

 

 

# 입력

입력이 주어진다.

입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다.

각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다.

또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.

 

# 출력

입력받은 그대로 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] strArr = new String[100];
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < strArr.length; i++) {
            String tempStr = br.readLine();
            if (tempStr != null && !tempStr.equals("")) {
                sb.append(tempStr + "\n");
            } else {
                break;
            }
        }

        System.out.println(sb);
    }
}
  • String 배열을 100개 선언하고 거기다 값을 넣고 출력할려고 했었습니다.
    => 문제를 보면 최대 100개만 입력을 한다고 나와있어서 위와 같이 했습니다.
    => 생각해보니 반복문을 최대 100번만 돌면 되게 하면 되지 않을까 싶어서 코드를 아래와 같이 변경했습니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100; i++) {
            String tempStr = br.readLine();
            if (tempStr != null && !tempStr.equals("")) {
                sb.append(tempStr + "\n");
            } else {
                break;
            }
        }
        System.out.println(sb);
    }
}
  • 위와 같이 변경했는데 보면볼수록 코드가 더러운것 같아서 다른분들이 제출한 코드를 찾아봤습니다.

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        String str = "";
 
        while ((str = br.readLine()) != null) {
            System.out.println(str);
        }
    }
}
  • readLine()으로 읽어온 값이 null이 아닐때까지 String 값을 출력하는 심플한 코드를 찾았습니다.
  • 위 코드는 저도 한번 작성해볼까 생각했는데 너무 간단한것 같아서 작성하지 않았던 코드입니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringBuilder sb = new StringBuilder();
        while(true){
            String str = br.readLine();
            if (str == null || str.isEmpty()) {
                break;
            }
            sb.append(str + "\n");
        }
        br.close();
        
        System.out.println(sb);
    }
}
  • 개인적으로 위의 코드가 제일 깔끔하고 제가 작성했던 코드와 조금 비슷하다고 생각했습니다.
  • for문 대신에 while문을 사용
  • readLine()에서 읽어온 값이 null이거나 빈값이면 while문 break(종료)
  • StringBuilder를 사용해서 입력된 값을 전부 저장하고 개행문자로 각 라인을 구분
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/2754

 

2754번: 학점계산

어떤 사람의 C언어 성적이 주어졌을 때, 평점은 몇 점인지 출력하는 프로그램을 작성하시오. A+: 4.3, A0: 4.0, A-: 3.7 B+: 3.3, B0: 3.0, B-: 2.7 C+: 2.3, C0: 2.0, C-: 1.7 D+: 1.3, D0: 1.0, D-: 0.7 F: 0.0

www.acmicpc.net

 

# 문제

어떤 사람의 C언어 성적이 주어졌을 때, 평점은 몇 점인지 출력하는 프로그램을 작성하시오.

A+: 4.3, A0: 4.0, A-: 3.7

B+: 3.3, B0: 3.0, B-: 2.7

C+: 2.3, C0: 2.0, C-: 1.7

D+: 1.3, D0: 1.0, D-: 0.7

F: 0.0

 

# 입력

첫째 줄에 C언어 성적이 주어진다.

성적은 문제에서 설명한 13가지 중 하나이다.

 

# 출력

첫째 줄에 C언어 평점을 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String n = br.readLine();

        String grade = "A+: 4.3, A0: 4.0, A-: 3.7, " +
                        "B+: 3.3, B0: 3.0, B-: 2.7, " +
                        "C+: 2.3, C0: 2.0, C-: 1.7, " +
                        "D+: 1.3, D0: 1.0, D-: 0.7, " +
                        "F: 0.0";

        grade = grade.replace(" ", "");
        String[] gradeArr = grade.split(",");

        for (int i = 0; i < gradeArr.length; i++) {
            String[] tempStrArr = gradeArr[i].split(":");
            if (n.equals(tempStrArr[0])) {
                System.out.println(tempStrArr[1]);
            }
        }
    }
}

 

반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/9086

 

9086번: 문자열

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

www.acmicpc.net

 

# 문제

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

 

# 입력

입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다.

각 테스트 케이스는 한 줄에 하나의 문자열이 주어진다.

문자열은 알파벳 A~Z 대문자로 이루어지며 알파벳 사이에 공백은 없으며 문자열의 길이는 1000보다 작다.

 

# 출력

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

 

 

# 제출한 소스코드

더보기

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            String tempStr = br.readLine();
            System.out.print(tempStr.charAt(0));
            System.out.printf(tempStr.charAt(tempStr.length()) + "\n");
        }
    }
}
  • 런타임 에러 (StringIndexOutOfBounds) 발생

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            String tempStr = br.readLine();
            System.out.print(tempStr.charAt(0));
            System.out.printf(tempStr.substring(tempStr.length() - 1) + "\n");
        }
    }
}
  • charAt()과 substring() 같이 사용한 것

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            String tempStr = br.readLine();
            System.out.print(tempStr.charAt(0));
            System.out.printf(tempStr.charAt(tempStr.length() - 1) + "\n");
        }
    }
}
  • charAt() 함수만 사용한 것
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/2744

 

2744번: 대소문자 바꾸기

영어 소문자와 대문자로 이루어진 단어를 입력받은 뒤, 대문자는 소문자로, 소문자는 대문자로 바꾸어 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

# 문제

영어 소문자와 대문자로 이루어진 단어를 입력받은 뒤, 대문자는 소문자로, 소문자는 대문자로 바꾸어 출력하는 프로그램을 작성하시오.

 

# 입력

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

단어의 길이는 최대 100이다.

 

# 출력

첫째 줄에 입력으로 주어진 단어에서 대문자는 소문자로, 소문자는 대문자로 바꾼 단어를 출력한다.

 

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = br.readLine();

        for (int i = 0; i < inputStr.length(); i++ ) {
            int tempInt = inputStr.charAt(i);
            if (tempInt > 90) {
                tempInt -= 32;
                System.out.print((char)tempInt);
            } else {
                tempInt += 32;
                System.out.print((char)tempInt);
            }
        }
    }
}
  • 아스키코드에 대해 알고 있으면 쉽게 풀 수 있는 문제
  • 입력된 문자열의 각 인덱스에 있는 char를 숫자로 변환 후 아스키 코드 값에 맞게 더하기 빼기 연산
  • 연산된 int 자료형 변수를 다시 char 자료형으로 변환 후 출력해준다.

 

 

 

첫 번째 제출한 코드 리팩터링 후

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputStr = br.readLine();

        for (int i = 0; i < inputStr.length(); i++ ) {
            int tempNum = inputStr.charAt(i);
            tempNum = tempNum > 90 ? tempNum - 32 : tempNum + 32;
            System.out.print((char)tempNum);
        }
    }
}
  • if else 대신에 3항 연산자 사용
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/13699

 

13699번: 점화식

다음의 점화식에 의해 정의된 수열 t(n)을 생각하자: t(0)=1 t(n)=t(0)*t(n-1)+t(1)*t(n-2)+...+t(n-1)*t(0) 이 정의에 따르면, t(1)=t(0)*t(0)=1 t(2)=t(0)*t(1)+t(1)*t(0)=2 t(3)=t(0)*t(2)+t(1)*t(1)+t(2)*t(0)=5 ... 주어진 입력 0 ≤ n

www.acmicpc.net

 

# 문제

다음의 점화식에 의해 정의된 수열 t(n)을 생각하자:

  • t(0)=1
  • t(n)=t(0)*t(n-1)+t(1)*t(n-2)+...+t(n-1)*t(0)

이 정의에 따르면,

  • t(1)=t(0)*t(0)=1
  • t(2)=t(0)*t(1)+t(1)*t(0)=2
  • t(3)=t(0)*t(2)+t(1)*t(1)+t(2)*t(0)=5
  • ...

주어진 입력 0 ≤ n ≤ 35에 대하여 t(n)을 출력하는 프로그램을 작성하시오.

 

 

# 입력

첫째 줄에 n (0 ≤ n ≤ 35)이 주어진다.

 

 

# 출력

첫째 줄에 t(n)을 출력한다.

 

 

# 제출한 소스코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        long[] dp = new long[36];
        dp[0] = 1;
        dp[1] = 1;

        for ( int i = 2; i < 36; i++ ) {
            for ( int j = 0; j < i; j++ ) {
                dp[i] += (dp[j] * dp[i - 1 - j]);
            }
        }
        System.out.println(dp[n]);
    }
}

 

 

# 참고자료

 

 

# 풀면서 느낀점 및 공부해야 할 것들

  • 공식이 나와있는것을 코드로 옮기는 능력이 부족하다.
  • 수학에대한 기본적인 지식이 너무 부족하고 학습하는 속도가 너무 느리다.
  • 혼자서 직접 풀어보고 해당 문제를 이해할 수 있도록 다양한 영상과 개념을 찾아서 글로 정리해보자.
  • 문제를 풀기전에 우선 노트에 내용을 정리해보기.
  • 문제를 풀지 못했다면 풀이를 보면서 한단계 한단계 어떻게 돌아가는지 직접 보기(노트 작성)
  • 공부해야 할 것들
    1. 피보나치 수열이란?
    2. 점화식이란?
    3. 재귀함수란?
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/11050

 

11050번: 이항 계수 1

첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\))

www.acmicpc.net

 

# 문제

 

# 입력

 

# 출력

 

# 제출한 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        System.out.println(bin(n, k));
    }

    private static int bin(int n, int k) {
        if ( k == 0 || n == k ) return 1;
        else return bin(n -1, k - 1 ) + bin(n - 1, k );
    }
}
  • 동적계획법의 사례
  • 조합에서 가장 기본이 되는 문제입니다. 일반 점화식을 이용하면 이 문제를 쉽게 해결할 수 있습니다.

N과 K의 값을 입력받고 DP배열을 선언합니다(D[N + 1][N + 1]) 그리고 DP 배열의 값을 다음과 같이 초기화합니다.

 

# DP 배열 초기화

D[i][1] = i // i개 중 1개를 뽑는 경우의 수는 i개

D[i][0] = 1 // i개 중 1개도 선택하지 않는 경우의 수는 1개

D[i][i] = 1  // i개 중 i개를 선택하는 경우의 수는 1개

 

 

# 참고자료

  • 유튜브 채널 <하루코딩> => 링크
  • 유튜브 채널 <주니온TV 아무거나연구소> => 링크
반응형

# 문제 출제 사이트

https://www.acmicpc.net/problem/1259

 

1259번: 팰린드롬수

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

www.acmicpc.net

 

# 문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

 

# 입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다.

입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

 

# 출력

각 줄마다 주어진 수가 팰린드롬수면 'yes', 아니면 'no'를 출력한다.

 

 

# 제출한 소스코드

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
  public static void main(String[] args) throws IOException   {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String tempStr;
    while ( true ) {
      tempStr = br.readLine();
      if ( tempStr.equals("0")) break;
      int dividedNum = tempStr.length() / 2;
      char middleStr = tempStr.charAt(dividedNum);
      String[] strArr = tempStr.split(String.valueOf(middleStr));

      char[] charArr = strArr[1].toCharArray();
      Arrays.sort(charArr);


      if ( strArr[0].length() != strArr[1].length()) {
        System.out.println("no");
      } else if ( strArr[0].equals(new String(charArr) ) ) {
        System.out.println("yes");
      }
    }
  }
}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
  public static void main(String[] args) throws IOException   {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    boolean flag = false;
    while ( true ) {
        String inputStr = br.readLine();
        if ( inputStr.equals("0"))  {
          break;
        } else {
          int intputStrLength = inputStr.length();
          for ( int i = 0; i < intputStrLength / 2; i++ ) {
              if ( inputStr.charAt(i) == inputStr.charAt((intputStrLength - 1) - i) ) {
                  flag = true;
              } else {
                  flag = false;
              }
          }
          System.out.println(flag == true? "yes" : "no");
        };
    }
  }
}
  • 틀린 소스 코드

 

첫번째 정답 소스 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        while ( true ) {
            boolean flag = true;
            String inputStr = br.readLine();
            
            if ( inputStr.equals("0"))  {
                break;
            } else {
                int inputStrLength = inputStr.length();
                for ( int i = 0; i < inputStrLength / 2; i++ ) {
                    if (inputStr.charAt(i) != inputStr.charAt( (inputStrLength - 1)  - i) ) {
                        flag = false;
                        break;
                    }
                }
            }
            System.out.println(flag == true? "yes" : "no");
        }
    }
}
  • BufferedReader를 사용해서 각 줄을 읽어온다.
  • 입력된 줄의 값이 "0" 이면 while 반복문을 중지한다.
  • 반복문을 통해 inputStr의 인덱스 0 부터 inputStr의 길이에 나누기 2를 한 값 만큼 가동한다.
    • charAt을 사용해서 앞에서 부터 읽는 숫자와 뒤에서부터 읽는 숫자를 비교한다.
    • 비교 중 앞에서 읽은 숫자와 뒤에서부터 읽은 숫자와 다르면 flag 변수에 false 를 할당하고 반복문 종료
  • 삼항 연산자를 사용해서 flag가 true 이면 "yes" false이면 "no"를 출력하도록 한다.

 

 

제출한 코드 리팩터링

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while ( true ) {
            boolean flag = true;
            String inputStr = br.readLine();

            if ( inputStr.equals("0")) break;

            int inputStrLength = inputStr.length();
            for ( int i = 0; i < inputStrLength / 2; i++ ) {
                int secondStrIndex = (inputStrLength - 1)  - i;
                if (inputStr.charAt(i) != inputStr.charAt(secondStrIndex) ) {
                    flag = false;
                    break;
                }
            }
            System.out.println(flag == true? "yes" : "no");
        }
    }
}

 

 

# 참고자료

반응형

+ Recent posts