[백준] 2504번 괄호의 값

[백준] 2504번 괄호의 값

출처: [백준] 2504번 괄호의 값


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 29463 7308 5555 27.818%

문제

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.

  1. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.
  2. 만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다.
  3. X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다.

예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.

  1. ‘()’ 인 괄호열의 값은 2이다.
  2. ‘[]’ 인 괄호열의 값은 3이다.
  3. ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
  4. ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
  5. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.

예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[ ]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.

여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.


입력

첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.


출력

첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.


예제 입력 1

1
(()[[]])([])

예제 출력 1

1
28

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import sys

input = sys.stdin.readline

input_string = list(input().rstrip())

stack = []


def solution(string):
for bracket in string:

if bracket == ')':
tmp = 0
while stack:
top = stack.pop()
if top == '(':
if tmp == 0:
stack.append(2)
else:
stack.append(tmp * 2)
break
elif top == '[':
return 0
else:
tmp += int(top)

elif bracket == ']':
tmp = 0
while stack:
top = stack.pop()
if top == '[':
if tmp == 0:
stack.append(3)
else:
stack.append(tmp * 3)
break
elif top == '(':
return 0
else:
tmp += int(top)
else:
stack.append(bracket)
return stack


if solution(input_string):
print(0 if '(' in stack or '[' in stack else sum(stack))
else:
print(0)

[백준] 2167번 2차원 배열의 합

[백준] 2167번 2차원 배열의 합

출처: [백준] 2167번 2차원 배열의 합


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 17302 9928 7836 59.296%

문제

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


입력

첫째 줄에 배열의 크기 N, M(1 ≤ N, M ≤ 300)이 주어진다. 다음 N개의 줄에는 M개의 정수로 배열이 주어진다. 배열에 포함되어 있는 수는 절댓값이 10,000보다 작거나 같은 정수이다. 그 다음 줄에는 합을 구할 부분의 개수 K(1 ≤ K ≤ 10,000)가 주어진다. 다음 K개의 줄에는 네 개의 정수로 i, j, x, y가 주어진다(i ≤ x, j ≤ y).


출력

K개의 줄에 순서대로 배열의 합을 출력한다. 배열의 합은 231-1보다 작거나 같다.


예제 입력 1

1
2
3
4
5
6
7
2 3
1 2 4
8 16 32
3
1 1 2 3
1 2 1 2
1 3 2 3

예제 출력 1

1
2
3
63
2
36

출처

  • 빠진 조건을 찾은 사람: iriszero
  • 잘못된 데이터를 찾은 사람: tncks0121

알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys

input = sys.stdin.readline

N, M = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(N)]
K = int(input())

dp = [[0] * (M + 1) for _ in range(N + 1)]
for i in range(1, N + 1):
for j in range(1, M + 1):
dp[i][j] = matrix[i - 1][j - 1] + dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - 1]

for _ in range(K):
i, j, x, y = map(int, input().split())
print(dp[x][y] - dp[x][j - 1] - dp[i - 1][y] + dp[i - 1][j - 1])

소스코드 (시간초과)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys

input = sys.stdin.readline

N, M = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(N)]
K = int(input())

for _ in range(K):
i, j, x, y = map(int, input().split())
arr_sum = 0
for a in range(i, x + 1):
for b in range(j, y + 1):
arr_sum += matrix[a - 1][b - 1]
print(arr_sum)

[백준] 3046번 R2

[백준] 3046번 R2

출처: [백준] 3046번 R2


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 14772 12053 11178 82.788%

문제

두 숫자 R1과 R2가 있을 때, 두 수의 평균 S는 (R1+R2)/2와 같다. 상근이는 정인이 생일 선물로 두 숫자 R1과 R2를 주려고 한다. 생일 파티에서 상근이는 정인이에게 이 두 숫자를 말해주고, 정인이는 이 숫자를 받아 적는다. 그리고 나서 기쁜 마음으로 1년동안 이 숫자를 외우면서 산다.

상근이는 R1과 R2를 엄청난 고민 끝에 정했다. 작년에는 R1과 R2를 까먹어서 아무 숫자나 정해서 주었기 때문에, 올해는 까먹지 않기 위해서 평균 S도 같이 기억하려고 한다.

오늘은 정인이 생일이다. 5분 후에 상근이는 생일 선물로 두 숫자 R1과 R2를 말해주어야 하지만, 안타깝게도 R2를 까먹고 말았다. 하지만 R1과 S는 기억하고 있다!

상근이를 도와 R2가 몇 인지 구하는 프로그램을 작성하시오.


입력

첫째 줄에 두 정수 R1과 S가 주어진다. 두 수는 -1000보다 크거나 같고, 1000보다 작거나 같다.


출력

첫째 줄에 R2를 출력한다.


예제 입력 1

1
11 15

예제 출력 1

1
19

예제 입력 2

1
4 3

예제 출력 2

1
2

출처


알고리즘 분류


소스코드

1
2
3
4
R1, S = map(int, input().split())

print(S * 2 - R1)

[백준] 10797번 10부제

[백준] 10797번 10부제

출처: [백준] 10797번 10부제


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 11595 9291 8405 81.880%

문제

서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는 자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금지하는 것이다. 예를 들어, 자동차 번호의 일의 자리 숫자가 7이면 7일, 17일, 27일에 운행하지 못한다. 또한, 자동차 번호의 일의 자리 숫자가 0이면 10일, 20일, 30일에 운행하지 못한다.

여러분들은 일일 경찰관이 되어 10부제를 위반하는 자동차의 대수를 세는 봉사활동을 하려고 한다. 날짜의 일의 자리 숫자가 주어지고 5대의 자동차 번호의 일의 자리 숫자가 주어졌을 때 위반하는 자동차의 대수를 출력하면 된다.


입력

첫 줄에는 날짜의 일의 자리 숫자가 주어지고 두 번째 줄에는 5대의 자동차 번호의 일의 자리 숫자가 주어진다. 날짜와 자동차의 일의 자리 숫자는 모두 0에서 9까지의 정수 중 하나이다.


출력

주어진 날짜와 자동차의 일의 자리 숫자를 보고 10부제를 위반하는 차량의 대수를 출력한다.


예제 입력 1

1
2
1
1 2 3 4 5

예제 출력 1

1
1

예제 입력 2

1
2
3
1
1
1

예제 출력 2

1
2

예제 입력 3

1
2
5
1 3 0 7 4

예제 출력 3

1
0

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
N = int(input())
car_list = list(map(int, input().split()))

count = 0

for car in car_list:
if N == car:
count += 1

print(count)

[백준] 2902번 KMP는 왜 KMP일까?

[백준] 2902번 KMP는 왜 KMP일까?

출처: [백준] 2902번 KMP는 왜 KMP일까?


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 11163 8826 7996 80.768%

문제

KMP 알고리즘이 KMP인 이유는 이를 만든 사람의 성이 Knuth, Morris, Prett이기 때문이다. 이렇게 알고리즘에는 발견한 사람의 성을 따서 이름을 붙이는 경우가 많다.

또 다른 예로, 유명한 비대칭 암호화 알고리즘 RSA는 이를 만든 사람의 이름이 Rivest, Shamir, Adleman이다.

사람들은 이렇게 사람 성이 들어간 알고리즘을 두 가지 형태로 부른다.

  • 첫 번째는 성을 모두 쓰고, 이를 하이픈(-)으로 이어 붙인 것이다. 예를 들면, Knuth-Morris-Pratt이다. 이것을 긴 형태라고 부른다.
  • 두 번째로 짧은 형태는 만든 사람의 성의 첫 글자만 따서 부르는 것이다. 예를 들면, KMP이다.

동혁이는 매일매일 자신이 한 일을 모두 메모장에 적어놓는다. 잠을 자기 전에, 오늘 하루 무엇을 했는지 되새겨 보는 것으로 하루를 마감한다.

하루는 이 메모를 보던 중, 지금까지 긴 형태와 짧은 형태를 섞어서 적어 놓은 것을 발견했다.

이렇게 긴 형태로 하루 일을 기록하다가는 메모장 가격이 부담되어 파산될 것이 뻔하기 때문에, 앞으로는 짧은 형태로 기록하려고 한다.

긴 형태의 알고리즘 이름이 주어졌을 때, 이를 짧은 형태로 바꾸어 출력하는 프로그램을 작성하시오.


입력

입력은 한 줄로 이루어져 있고, 최대 100글자의 영어 알파벳 대문자, 소문자, 그리고 하이픈 (‘-‘, 아스키코드 45)로만 이루어져 있다. 첫 번째 글자는 항상 대문자이다. 그리고, 하이픈 뒤에는 반드시 대문자이다. 그 외의 모든 문자는 모두 소문자이다.


출력

첫 줄에 짧은 형태 이름을 출력한다.


예제 입력 1

1
Knuth-Morris-Pratt

예제 출력 1

1
KMP

예제 입력 2

1
Mirko-Slavko

예제 출력 2

1
MS

예제 입력 3

1
Pasko-Patak

예제 출력 3

1
PP

출처


알고리즘 분류


소스코드1

1
2
3
4
5
6
7
input_string = list(input().split('-'))
output_string = ''

for x in input_string:
output_string += x[0]

print(output_string)

소스코드2

1
2
3
4
5
6
7
8
9
input_string = list(input().rstrip())
output_string = ''

for x in input_string:
if 'A' <= x <= 'Z':
output_string += x

print(output_string)

[백준] 1032번 명령 프롬프트

[백준] 1032번 명령 프롬프트

출처: [백준] 1032번 명령 프롬프트


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 17770 8716 7470 50.740%

문제

시작 -> 실행 -> cmd를 쳐보자. 검정 화면이 눈에 보인다. 여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다. 이때 원하는 파일을 찾으려면 다음과 같이 하면 된다.

dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다. “dir 패턴”과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다. 예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고, 확장자가 exe인 것이 모두 나온다. 이때 두 번째 문자는 아무거나 나와도 된다. 예를 들어, acb.exe, aab.exe, apb.exe가 나온다.

이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 “.” 그리고 “?”만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.


입력

첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은 알파벳과 “.” 그리고 “?”로만 이루어져 있다.


출력

첫째 줄에 패턴을 출력하면 된다.


예제 입력 1

1
2
3
4
3
config.sys
config.inf
configures

예제 출력 1

1
config????

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys

input = sys.stdin.readline

N = int(input())
file_list = [list(input().rstrip()) for _ in range(N)]

input_word = file_list[-1]

for i in range(N - 1):
for j in range(len(input_word)):
if input_word[j] == file_list[i][j]:
continue
else:
input_word[j] = '?'

print(''.join(input_word))
[백준] 1100번 하얀 칸

[백준] 1100번 하얀 칸

출처: [백준] 1100번 하얀 칸


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 14533 9611 8429 68.724%

문제

체스판은 8*8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.


입력

첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. ‘.’은 빈 칸이고, ‘F’는 위에 말이 있는 칸이다.


출력

첫째 줄에 문제의 정답을 출력한다.


예제 입력 1

1
2
3
4
5
6
7
8
.F.F...F
F...F.F.
...F.F.F
F.F...F.
.F...F..
F...F.F.
.F.F.F.F
..FF..F.

예제 출력 1

1
1

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys

input = sys.stdin.readline
input_board = [list(input().rstrip()) for _ in range(8)]

count = 0
for i in range(8):
for j in range(8):
if (i + j) % 2 == 0:
if input_board[i][j] == 'F':
count += 1

print(count)

[백준] 2743번 단어 길이 재기

[백준] 2743번 단어 길이 재기

출처: [백준] 2743번 단어 길이 재기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 14281 11663 10225 83.171%

문제

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


입력

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


출력

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


예제 입력 1

1
pulljima

예제 출력 1

1
8

출처

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

알고리즘 분류


소스코드

1
2
3
4
string = input()

print(len(string))

[백준] 2563번 색종이

[백준] 2563번 색종이

출처: [백준] 2563번 색종이


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 9793 6870 5908 71.327%

문제

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

img

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.


입력

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다


출력

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.


예제 입력 1

1
2
3
4
3
3 7
15 7
5 2

예제 출력 1

1
260

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys

input = sys.stdin.readline

papers = [[0 for _ in range(101)] for _ in range(101)]

N = int(input())
for _ in range(N):
x, y = map(int, input().split())
for i in range(x, x + 10):
for j in range(y, y + 10):
papers[j][i] = 1

result = 0
for row in papers:
result += row.count(1)

print(result)

[백준] 10808번 알파벳 개수

[백준] 10808번 알파벳 개수

출처: [백준] 10808번 알파벳 개수


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 18151 12517 10446 69.850%

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.


입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.


출력

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.


예제 입력 1

1
baekjoon

예제 출력 1

1
1 1 0 0 1 0 0 0 0 1 1 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0

출처

  • 문제를 만든 사람: baekjoon
  • 잘못된 데이터를 찾은 사람: djm03178
  • 문제의 오타를 찾은 사람: eric00513

알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys

input = sys.stdin.readline

string = list(input().rstrip())

alpha_count = {}
for i in range(ord('z') - ord('a') + 1):
alpha_count[chr(ord('a') + i)] = 0

for alphabet in string:
alpha_count[alphabet] += 1

print(*list(alpha_count.values()))