문제 설명

1. 단어를 입력받아 길이 출력

풀이

1. String.length()

코드

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/2743
* BOJ 백준온라인져지 2743 단어 길이 재기 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
bw.write(String.valueOf(br.readLine().length()));
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 입력으로 주어진 단어의 길이를 출력한다.

예제 입력 1 

pulljima

예제 출력 1 

8

출처

  • 데이터를 추가한 사람: 79brue
  • 문제를 만든 사람: baekjoon

알고리즘 분류


문제 설명

1. N 줄 부터는 별 찍기 6 과 동일하다.
2. N - 1 줄 까지는 N - i 개의 공백이 들어간 후 별이 2N - 1 개 만큼 찍힌다.

풀이

1. 문제 설명의 (2) 를 for loop 으로 작성
2. 별 찍기 - 6 코드 복붙

코드

문제

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

입력

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

출력

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

예제 입력 1 

5

예제 출력 1 

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

출처


문제 설명

1. 2 * N - ((i - 1) * 2 + 1) 만큼 별을 출력해주면 된다.
2. 공백은 i - 1 개가 라인마다 들어간다.

풀이

1. for loop 을 돌면서 문자열을 추가해줌 공백 or 별

코드

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/2443
* BOJ 백준온라인져지 2443 별찍기 - 6 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
for (int i = 1; i <= N; i++) {
for (int j = 1; j < i; j++) bw.write(" ");
for (int j = 1; j <= 2 * N - ((i - 1) * 2 + 1); j++) bw.write("*");
bw.write("\n");
}
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

첫째 줄에는 별 2*N-1개, 둘째 줄에는 별 2*N-3개, ..., N번째 줄에는 별 1개를 찍는 문제

별은 가운데를 기준으로 대칭이어야 한다.

입력

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

출력

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

예제 입력 1 

5

예제 출력 1 

*********
 *******
  *****
   ***
    *

출처


문제 설명

1. 쉽게 설명하면 2차원 배열에서 [i][j] ~ [x][y] 까지의 합을 구해서 출력하면 되는 문제다.
2. 문제의 데이터가 약해서 naive 하게 풀어도 풀린다.
3. dp 를 이용하면 소요되는 시간을 최소화 시킬 수 있다.

풀이

1. dp 를 이용해서 풀이하는 방법이다.
2. dp[i][j] 를 0,0 ~ i,j 까지의 합이 들어간다고 생각하고 구현하면, 사각형으로 세 구역이 나눠질 수 있다.
3. 문제에서 구하라고 제시한 구역과 그것이 아닌구역(아닌 구역을 2개로 나누면 위, 옆이 된다.) 총 3개
4. 풀이 방법은 0,0 ~ i,j 즉 dp[i][j] 에 나머지 영역을 빼주는 방법이다.

증명

수학적 귀납법
1. dp[1][1] = 항상 n[1][1] 이다.
2. dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + n[i][j] 로 하면 중복된 구역이 중복이 아니게 되고, 나머지 구역들이 더해지게 된다.
3. (2) 로 구해진 dp 배열을 사용해서 (2) 방식으로 구역의 합을 구한다.

코드

import java.util.*;
import java.io.*;
/**
* https://www.acmicpc.net/problem/2167
* BOJ 백준온라인져지 2167 2차원 배열의 합 풀이
*/
public class Main {
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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 M = Integer.parseInt(st.nextToken());
int dp[][] = new int[N + 1][M + 1];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= M; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + Integer.parseInt(st.nextToken());
}
}
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
bw.write(String.valueOf(dp[x2][y2] + dp[x1 - 1][y1 - 1] - dp[x1 - 1][y2] - dp[x2][y1 - 1]));
bw.write("\n");
}
bw.flush();
}
}
view raw Main.java hosted with ❤ by GitHub

문제

2차원 배열이 주어졌을 때 (i, j) 위치부터 (x, y) 위치까지에 저장되어 있는 수들의 합을 구하는 프로그램을 작성하시오. 배열의 (i, j) 위치는 i행 j열을 나타낸다.

입력

첫째 줄에 배열의 크기 N, M(1≤N, M≤300)이 주어진다. 다음 N개의 줄에는 M개의 정수로 배열이 주어진다. 그 다음 줄에는 합을 구할 부분의 개수 K(1≤K≤10,000)가 주어진다. 다음 K개의 줄에는 네 개의 정수로 i, j, x, y가 주어진다(i≤x, j≤y).

출력

K개의 줄에 순서대로 배열의 합을 출력한다. 배열의 합은 32bit-int 범위를 초과하지 않는다.

예제 입력 1 

2 3
1 2 4
8 16 32
3
1 1 2 3
1 2 1 2
1 3 2 3

예제 출력 1 

63
2
36

출처



    문제 설명

    1. 문자열을 처리

    풀이

    1. StringTokenizer 로 공백을 기준으로 split 해서 token  을 가져온다.
    2. 첫 음절은 무조건 god 이기 때문에 처리해준다.

    코드

    import java.util.*;
    import java.io.*;
    /**
    * https://www.acmicpc.net/problem/13163
    * BOJ 백준온라인져지 13163 닉네임에 갓 붙이기 풀이
    */
    public class Main {
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String args[]) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int N = Integer.parseInt(br.readLine());
    for (int i = 0; i < N; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine());
    st.nextToken();
    bw.write("god");
    while (st.hasMoreTokens()) bw.write(st.nextToken());
    bw.write("\n");
    }
    bw.flush();
    }
    }
    view raw Main.java hosted with ❤ by GitHub

    문제

    방금 막 프로그래밍을 배우기 시작한 찬우는 acmicpc.net에 있는 회원들이 모두 신같이 보였다. 그래서 찬우는 모든 회원의 닉네임 앞에 ‘갓’을 붙이려고 한다.

    찬우가 ‘koosaga’라는 닉네임을 가진 회원을 갓으로 바꿔 부른다면 ‘godsaga’가 된다. 또, 찬우가 ‘acka’라는 닉네임을 가진 회원을 갓으로 바꿔 부른다면 ‘godka’가 될 것이다. 찬우는 닉네임을 갓으로 바꾸는 알고리즘을 생각하다가, 아래와 같이 2단계 방법을 사용하면 될 것으로 생각했다.

    • 닉네임을 음절 단위로 쪼갠다.
    • 가장 첫 음절을 ‘god’으로 바꾼 후 쪼갠 음절을 합친다.

    찬우는 수작업으로 N명의 닉네임을 모두 음절 단위로 쪼갰다. 찬우를 도와 이 닉네임들에 갓을 붙이는 프로그램을 작성하자.

    입력

    첫 번째 줄에는 닉네임의 수 N(1 ≤ N ≤ 100)이 주어진다. 두 번째 줄부터 N개의 줄에는 음절 단위로 쪼갠 닉네임이 주어진다. 각 줄은 알파벳 소문자와 공백만으로 이루어지며, 쪼갠 닉네임의 총 길이(공백 포함)는 100을 넘지 않는다. 쪼갠 닉네임에는 1개 이상의 공백이 존재한다.

    출력

    각 줄에 하나씩 갓을 붙인 닉네임을 출력한다.

    예제 입력 1 

    5
    baek joon
    koo sa ga
    ac ka
    yu ka ri ko
    ke sa ki yo
    

    예제 출력 1 

    godjoon
    godsaga
    godka
    godkariko
    godsakiyo
    


    문제 설명

    1. A * (I - 1 < x= < I) 의 최소를 구하면 됨

    풀이

    x / A = 올림(I) 이다.
    올림(I) * A = x -> (I - 1) * A = X

    코드

    import java.util.*;
    import java.io.*;
    /**
    * https://www.acmicpc.net/problem/2914
    * BOJ 백준온라인져지 2914 저작권 풀이
    */
    public class Main {
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String args[]) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str1[] = br.readLine().split(" ");
    int A = Integer.parseInt(str1[0]);
    int I = Integer.parseInt(str1[1]);
    bw.write(String.valueOf(A * (I - 1) + 1));
    bw.flush();
    }
    }
    view raw Main.java hosted with ❤ by GitHub
    시간 제한메모리 제한제출정답맞은 사람정답 비율
    1 초128 MB27592320211385.305%

    문제

    창영이는 노래 여러 개를 이어서 부르는 가수이다. 유명한 노래의 비슷한 멜로디를 이어서 부르면서 언제 곡이 넘어갔는지 모르게 만드는 것이 창영이 노래의 특징이다. 이런 노래로 상업적으로 엄청난 성공을 거둔 창영이에게 큰 시련이 찾아왔다. 그것은 바로 저작권이었다.

    창영이의 노래에 포함되어 있는 멜로디는 모두 저작권이 다른 사람에게 있는 노래이다. 따라서, 이 음악으로 상업적인 활동을 했기 때문에, 저작권 협회에 저작권료를 내야한다.

    창영이는 자신의 앨범에 포함되어있는 저작권이 있는 멜로디의 평균값을 구해보기로 했다. 이 값은 아래와 같이 구할 수 있다.

    (창영이 앨범에 수록된 곡에 포함되어 있는 저작권이 있는 멜로디의 개수) / (앨범에 수록된 곡의 개수)

    이 때, 평균값은 항상 올림을 해서 정수로 만들어야 한다. 예를 들어, 창영이의 1집 앨범 "영창에서 영원히 영창피아노를 친다"에 총 38개 곡이 수록되어 있고, 이 앨범에 저작권이 있는 멜로디가 894개가 있다면, 평균값은 23.53이 되고 올림해서 24가 된다.

    매니저 강산이는 얼마나 많은 사람에게 저작권료를 주어야 하는지 궁금해졌다. 강산이가 알고 있는 정보는 앨범에 수록되어 있는 곡의 개수와 위에서 구한 평균값이다. 이 때, 적어도 몇 곡이 저작권이 있는 멜로디인지 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 앨범에 수록된 곡의 개수 A와 평균값 I가 주어진다. (1 ≤ A, I ≤ 100)

    출력

    첫째 줄에 적어도 몇 곡이 저작권이 있는 멜로디인지 출력한다.

    예제 입력 1 

    38 24
    

    예제 출력 1 

    875
    


    문제 설명

    3 개의 숫자를 이용해서 연도를 나타낸다.
    E, S, M 을 이용해서 해당 연도를 우리가 알고있는 연도로 변경하자

    풀이

    1. 0, 0, 0  에서 1 씩 증가시키면서 값을 확인한다.
    2. 15, 28, 19 보다 높아지면 1 로 만들어주고 다시 (1) 을 실행한다.

    코드

    import java.util.*;
    import java.io.*;
    /**
    * https://www.acmicpc.net/problem/1476
    * BOJ 백준온라인져지 1476 날짜 계산 풀이
    */
    public class Main {
    private static int cycle[] = { 15, 28, 19 };
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String args[]) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    int date[] = { Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) };
    int temp[] = { 0, 0, 0 };
    for (int i = 1; i <= 15 * 28 * 19; i++) {
    boolean t = true;
    for (int j = 0; j < 3; j++) {
    temp[j] = Math.max((temp[j] + 1) % (cycle[j] + 1), 1);
    if (date[j] != temp[j]) t = false;
    }
    if (t) {
    bw.write(String.valueOf(i));
    break;
    }
    }
    bw.flush();
    }
    }
    view raw Main.java hosted with ❤ by GitHub

    문제

    준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다.

    지구를 나타내는 숫자를 E, 태양을 나타내는 숫자를 S, 달을 나타내는 숫자를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)

    우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.

    예를 들어, 15년은 15 15 15로 나타낼 수 있다. 하지만, 1년이 지나서 16년이 지나면 16 16 16이 아니라 1 16 16이 된다. 이유는 1 ≤ E ≤ 15 라서 범위를 넘어가기 때문이다.

    E, S, M이 주어졌고, 1년이 준규가 사는 나라에서 1 1 1일때, 준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 세 수 E, S, M이 주어진다. 문제에 나와있는 범위를 지키는 입력만 주어진다.

    출력

    첫째 줄에 E S M으로 표시되는 가장 빠른 연도를 출력한다. 1 1 1은 항상 1이기 때문에, 정답이 음수가 나오는 경우는 없다.

    예제 입력 1 

    1 16 16
    

    예제 출력 1 

    16
    

    예제 입력 2 

    1 1 1
    

    예제 출력 2 

    1
    

    예제 입력 3 

    1 2 3
    

    예제 출력 3 

    5266
    

    예제 입력 4 

    15 28 19
    

    예제 출력 4 

    7980


    문제 설명

    5 -> 6
    6 -> 6
    으로 변경했을 때, 최대값 + 최대값
    5 -> 5
    6 -> 5
    으로 변경했을 때, 최소값 + 최소값
    출력

    풀이

    1. String 의 replaceAll 사용해서 5 -> 6 6 -> 5 변경

    코드

    import java.util.*;
    import java.io.*;
    /**
    * https://www.acmicpc.net/problem/2864
    * BOJ 백준온라인져지 2864 5와 6의 차이 풀이
    */
    public class Main {
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String args[]) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    String A = st.nextToken().replaceAll("5", "6");
    String B = st.nextToken().replaceAll("5", "6");
    bw.write((Integer.parseInt(A.replaceAll("6", "5")) + Integer.parseInt(B.replaceAll("6", "5"))) + " " + (Integer.parseInt(A) + Integer.parseInt(B)));
    bw.flush();
    }
    }
    view raw Main.java hosted with ❤ by GitHub

    문제

    상근이는 2863번에서 표를 너무 열심히 돌린 나머지 5와 6을 헷갈리기 시작했다.

    싱근이가 숫자 5를 볼 때, 5로 볼 때도 있지만, 6으로 잘못 볼 수도 있고, 6을 볼 때는, 6으로 볼 때도 있지만, 5로 잘못 볼 수도 있다.

    두 수 A와 B가 주어졌을 때, 상근이는 이 두 수를 더하려고 한다. 이 때, 상근이가 구할 수 있는 두 수의 가능한 합 중, 최소값과 최대값을 구해 출력하는 프로그램을 작성하시오.

    입력

    첫째 줄에 두 정수 A와 B가 주어진다. (1 <= A,B <= 1,000,000)

    출력

    첫째 줄에 상근이가 구할 수 있는 두 수의 합 중 최소값과 최대값을 출력한다.

    예제 입력 1 

    1430 4862
    

    예제 출력 1 

    6282 6292
    


    문제 설명

    연산자의 이해와 실수 연산을 이해하는지 확인하는 문제이다.

    풀이

    소수점 3 의 자리부터는 내림 처리를 하고 출력하면 된다.

    해답

    100 을 곱해주고 다 내림 처리 한다음 100 으로 나눈 후 출력한다.
    import java.util.*;
    import java.io.*;
    /**
    * https://www.acmicpc.net/problem/5355
    * BOJ 백준온라인져지 5355 화성 수학 풀이
    */
    public class Main {
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String args[]) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int N = Integer.parseInt(br.readLine());
    for (int i = 0; i < N; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine());
    double n = Double.parseDouble(st.nextToken());
    while (st.hasMoreTokens()) {
    switch (st.nextToken().charAt(0)) {
    case '@':
    n *= 3;
    break;
    case '%':
    n += 5;
    break;
    case '#':
    n -= 7;
    break;
    }
    }
    n = Math.floor(n * 100);
    System.out.format("%.2f\n", n / 100);
    }
    bw.flush();
    }
    }
    view raw Main.java hosted with ❤ by GitHub

    문제

    겨울 방학에 달에 다녀온 상근이는 여름 방학 때는 화성에 갔다 올 예정이다. (3996번) 화성에서는 지구와는 조금 다른 연산자 @, %, #을 사용한다. @는 3을 곱하고, %는 5를 더하며, #는 7을 빼는 연산자이다. 따라서, 화성에서는 수학 식의 가장 앞에 수가 하나 있고, 그 다음에는 연산자가 있다.

    입력

    첫째 줄에 테스트 케이스의 개수 T가 주어진다. 다음 줄에는 화성 수학식이 한 줄에 하나씩 주어진다. 수학식은 100자를 넘지 않는다.

    출력

    각 테스트 케이스에 대해서, 화성 수학식의 결과를 계산한 다음에, 소수점 둘째 자리까지 출력한다.

    예제 입력 1 

    3
    3 @ %
    10.4 # % @
    8 #
    

    예제 출력 1 

    14.00
    25.20
    1.00
    


    문제 설명

    중복된 수를 구하면 된다.

    풀이

    1. Bitset 을 사용하는 방법
    bitset 은 bit 의 0 1 로 그 숫자가 있나 없나 확인하는 테크닉이다.
    나중에 직접 구현해보면서 자세하게 적겠다.
    2. 등차수열의 합을 이용하는 방법
    S = N(N - 1)/2 + M
    M = S - N(N - 1)/2


    ISKU 님의 Buffer read 부분을 참고했습니다.

    해답

    import java.util.*;
    import java.io.*;
    /**
    * https://www.acmicpc.net/problem/15719
    * BOJ 백준온라인져지 15719 중복된 숫자 풀이
    */
    public class Main {
    private static byte[] buffer = new byte[78888905];
    private static int next;
    private static int b;
    public static void main(String args[]) throws IOException {
    System.in.read(buffer, 0, buffer.length);
    long N = nextInt();
    long sum = 0;
    for (int i = 0; i < N; i++) {
    sum += nextInt();
    }
    // sum - n(n - 1) / 2 = m
    System.out.println(sum - (N * (N - 1) / 2));
    }
    private static long nextInt() {
    long n = buffer[next++] - '0';
    while ((b = buffer[next++]) >= '0')
    n = (n * 10) + (b - '0');
    return n;
    }
    }
    view raw Main.java hosted with ❤ by GitHub

    문제

    1부터 N - 1까지의 정수가 하나씩 정렬되지 않은 채로 저장되어 있는 어떤 수열 A가 있다. 수열 A에 임의의 정수 M(1 ≤ M ≤ N – 1)을 넣어 크기가 N인 수열로 만들었을 때, 임의의 정수 M을 찾는 프로그램을 작성하라.

    입력

    첫째줄에 수열의 크기 N(2 ≤ N ≤ 10,000,000)이 주어진다.

    둘째줄에 수열 A의 원소인 N개의 정수가 주어진다. 입력으로 주어지는 정수는 모두 1부터 N – 1 사이의 정수이며 문제의 답인 M을 제외하고는 모두 서로 다른 정수이다.

    출력

    M을 출력하라.

    예제 입력 1 

    10
    1 2 2 5 6 4 3 7 8 9
    

    예제 출력 1 

    2
    


    + Recent posts