Home 백준 - 브론즈 문제 10개 (MJ)
Post
Cancel

백준 - 브론즈 문제 10개 (MJ)

1단계(#1152, #2475, #2480, #2577, #2908, #3052, #8958, #10809, #11720, #11654)

  • 브론즈 10개 = 업로드 1개
  • 브론즈를 푼 이유 : solved.ac에서 내 티어를 높이려면 1단계에 있는 문제들을 풀어야 했다. 1단계에는 전부 브론즈 문제들이었다.

1
2
3
4
5
6
7
8
9
10
#1152. 단어의 개수 (브론즈2)
#2475. 검증 수 (브론즈2)
#2480. 주사위 세 개 (브론즈4)
#2577. 숫자의 개수 (브론즈2)
#2908. 상수 (브론즈2)
#3052. 나머지 (브론즈2)
#8958. OX퀴즈 (브론즈2)
#10809. 알파벳찾기 (브론즈5)
#11720. 숫자의 합 (브론즈4)
#11654. 아스키코드 (브론즈5)

1152. 단어의 개수

백준브론즈2티어 문제이다.

📖Problem

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

출력

첫째 줄에 단어의 개수를 출력한다.

예제 1

1
2
Input : The Curious Case of Benjamin Button
Output : 6

예제 2

1
2
Input : The first character is a blank
Output : 6

예제 3

1
2
Input : The last character is a blank
Output : 6

🔍Solve

Approach

  • 이 문제는 말그대로 단어의 개수를 구하는 문제이다. 그렇다면 ‘단어’란 무엇일까. 일반적으로 자립하여 쓰일 수 있는 말의 단위를 의미한다. 따라서 단어는 ‘공백’으로 구분한다.
  • 단어를 공백을 따로 구분하여 저장한 후, 그 길이를 구하면 바로 답이 나온다.
  • 따라서 코드 내용도 매우 간단하다.

Submit

  • split()함수 : 괄호 안에 아무 값도 넣어 주지 않으면 공백(스페이스, 탭, 엔터 등)을 기준으로 문자열을 나누어 준다.
  • split()을 이용해서 공백을 기준으로 나누어 문자열에 저장한다.
  • 입력이 The first character is a blank일 때, 문자열 s = ‘ The, first, character, is, a, blank ’로 저장된다.
  • 따라서 문자열 길이가 곧 단어의 개수이다.
1
2
s = input().split()
print(len(s))
  • 사실 어떻게 할까 고민이 많았는데 생각보다 간단했다.

2475. 검증 수

📖Problem

컴퓨터를 제조하는 회사인 KOI 전자에서는 제조하는 컴퓨터마다 6자리의 고유번호를 매긴다. 고유번호의 처음 5자리에는 00000부터 99999까지의 수 중 하나가 주어지며 6번째 자리에는 검증수가 들어간다. 검증수는 고유번호의 처음 5자리에 들어가는 5개의 숫자를 각각 제곱한 수의 합을 10으로 나눈 나머지이다.

예를 들어 고유번호의 처음 5자리의 숫자들이 04256이면, 각 숫자를 제곱한 수들의 합 0+16+4+25+36 = 8110으로 나눈 나머지인 1이 검증수이다.

입력

첫째 줄에 고유번호의 처음 5자리의 숫자들이 빈칸을 사이에 두고 하나씩 주어진다.

출력

첫째 줄에 검증수를 출력한다.

예제 1

1
2
3
Input : 0 4 2 5 6
Output : 1

🔍Solve

  • 숫자 5개를 n에 한번에 입력받는다. 이때, 그냥 입력받으면 안 된다. map()을 이용하여 공백을 구분에 따라 나눠 저장되도록 한다.
  • for문을 통해 각 자릿수의 수를 제곱하여 sum에 더한다.
  • 이후, 10으로 나눈 나머지값인 answer를 출력한다.
1
2
3
4
5
6
7
8
n = list(map(int, input().split()))
sum = 0
answer = 0
for i in n:
    sum = i * i + sum

answer = sum % 10
print(answer)

2480. 주사위 세 개

백준브론즈 4티어 문제이다.

📖Problem

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

  1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
  2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
  3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.

예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

입력

첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.

출력

첫째 줄에 게임의 상금을 출력 한다.

예제1

1
2
Input : 3 3 6
Output : 1300

예제2

1
2
Input : 222
Output : 12000

예제3

1
2
Input : 6 2 5
Output : 600

🔍Solve

  • 주사위 세 개 a, b, c를 입력 받는다.
  • 조건문을 통해 문제에서 주어진 조건을 수행한다.
    1. 같은 눈이 3개가 나오면 → reward = 10000 + 같은 눈 ×1000
    2. 같은 눈이 2개만 나오면 → reward = 1000+(같은 눈)×100
    3. 모두 다른 눈이 나오면 → reward = (그 중 가장 큰 눈)×100
  • reward를 출력한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
a, b, c = map(int, input().split())
reward = 0

if a == b and b == c:
    reward = 10000 + a*1000
elif a== b or a == c:
    reward = 1000 + a*100
elif b == c:
    reward = 1000 + b*100
else:
    reward = max(a,b,c) * 100

print(reward)
  • 이 문제는 C++로도 풀었었는데 C++와 같은 구조로 풀었어도 파이썬에서는 런타임에러가 났다.
  • C++에서는 마지막에 max(max(a, b), c)이렇게 적어야 했는데, 파이썬은 그게 오히려 독이 되고 max(a,b,c)이렇게 한번에 적어도 된다.

2577. 숫자의 개수

백준브론즈2티어 문제이다.

📖Problem

세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

출력

첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

예제 입력

1
2
3
4
150
266
427

예제 출력

1
2
3
4
5
6
7
8
9
10
3
1
0
2
0
0
0
2
0
0

🔍Solve

  • 처음엔 리스트에 저장하는 것이 아니라 이중 for문을 반복하여 count 변수로 계산을 하는 것이었는데 런타임에러가 났다.
  • 아무리 수정해도 런타임에러에는 변화가 없었기에 다른 블로그를 참고해서 풀었다.
  • Flow
    • 입력값 a, b, c를 입력받는다.
    • 세 수를 모두 곱한 값을 result에 저장한다.
    • 0~9까지 몇 번 쓰였는지를 저장하는 리스트 li를 0으로 먼저 초기화한다
    • for문을 통해서 string형으로 형변환한 result를 돌면서 해당하는 li리스트인덱스로 가서 1씩 늘린다.
    • 이후 li리스트를 출력형태에 맞춰서 출력해야 하므로 for문으로 돌려 출력한다.
1
2
3
4
5
6
7
8
9
10
num1 = int(input()) # 150
num2 = int(input()) # 266
num3 = int(input()) # 427
result = num1 * num2 * num3  # [1, 7, 0, 3, 7, 3, 0, 0]
li = [0] * 10
for i in str(result):
    li[int(i)] += 1

for i in li:
    print(i)
  • 리스트에 적용하는 방법이 신선했다. i에 해당하는 인덱스로 가서 저장하면 바로 저장할 수 있기 때문에 굳이 이중 for문을 사용하지 않더라도 훨씬 효율적인 방법인 것 같다.

2908. 상수

📖Problem

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.

출력

첫째 줄에 상수의 대답을 출력한다.

예제 1

1
2
input : 734 893
output : 437

예제 2

1
2
input : 221 231
output : 132

예제 3

1
2
input : 839 237
output : 938

🔍Solve

  • leetcode에서 봤던 문제와 비슷하다 싶어 100곱하고 10곱하고 1곱하는 식으로 했는데 런타임에러가 났다.
  • 파이썬에서는 내장함수가 많아 함수 코드 자체가 워낙 메모리를 많이 차지하기 때문에 내장함수를 최대한 잘 활용해야 한다.
  • flow
    • 숫자 num1, num2를 입력받는다.
    • num1num2를 각각 [::-1]을 이용해서 역순으로 바꿔준다.
    • 최댓값은 max()함수를 이용해 구한다.
1
2
3
4
5
num1, num2 = input().split()
num1 = int(num1[::-1]) # [::-1] : 역순
num2 = int(num2[::-1]) 

print(max(num1, num2))
  • 새롭게 알게 된 것 : [::-1]
    • 역순을 구해야 할 때마다 for문을 i를 거꾸로 돌렸는데 그럴 필요 없이 [::-1]을 이용하면 쉽게 역순으로 바꿀 수 있다!!!!!!

3052. 나머지

백준브론즈2티어문제이다.

📖Problem

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

예제 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# input
1
2
3
4
5
6
7
8
9
10

# output
10

각 수를 42로 나눈 나머지는 1, 2, 3, 4, 5, 6, 7, 8, 9, 10이다.

예제 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# input
42
84
252
420
840
126
42
84
420
126

# output
1

모든 수를 42로 나눈 나머지는 0이다.

예제 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Input
39
40
41
42
43
44
82
83
84
85

# Ouput
6

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

🔍Solve

  • 이 문제는 나눠야 할 값이 42 로 정해져있다. 하지만 그냥 나머지로 나눠야하는 것이 아니라 나누어 서로 다른 값이 있는지 없는지 구분해야 한다.
    1. 처음에는 구분하기 위한 변수가 필요하다고 생각했다. 그래서 변수를 두고 문제를 풀었더니 계속해서 에러가 발생했다.
    2. 새로운 접근법은 2577. 숫자의 개수문제처럼 리스트를 이용하는 것이다.
    • 나눈 값을 저장하는 arr 리스트를 만든다.
    • for문을 통해서 입력받고, 바로 42로 나눈 나머지를 arrappend한다.
    • 이를 10번 반복한다.
    • 이후, 파이썬 내장 함수인 set()함수를 통해 중복을 제거한다.
      • set()함수는 리스트 내에 중복된 값을 제거해준다.
    • 이후 arr에 있는 나머지가 아니라 서로 다른 값의 개수를 출력해야 하므로 len()함수를 통해 출력한다.
1
2
3
4
5
6
arr = []
for i in range(10):
    n = int(input())
    arr.append(n%42)
arr = set(arr) #set() 중복제거
print(len(arr))
  • 이 문제도 다소 복잡하게 풀었는데 블로그를 통해 새로운 파이썬 함수를 알게 되었다. 브론즈 문제를 통해 내 부족한 점을 알 수 있었다.

8958. OX퀴즈

백준브론즈2티어 문제이다.

📖Problem

“OOXXOXXOOO”와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

“OOXXOXXOOO”의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력

각 테스트 케이스마다 점수를 출력한다.

예제 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# input
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

# output
10
9
7
55
30

🔍Solve

간단한 문제였다.

  • 테스트케이스인 t를 입력받는다.
  • 반복문 내에서 list를 입력받는다. (ox_list)
  • 리스트에서 O가 나오면 count+1을 해준 후, sum값에 count를 더해준다. 반면에 X가 나오면 count를 0으로 초기화한다.
  • t만큼 위의 과정을 반복한다.
  • 최종적으로는 sum을 출력한다.
1
2
3
4
5
6
7
8
9
10
11
12
t = int(input())
for _ in range(t):
    ox_list = list(input())
    count = 0
    sum = 0
    for ox in ox_list:
        if ox =='O':
            count += 1
            sum += count
        else:
            count = 0
    print(sum)

10809. 알파벳 찾기

백준브론즈5티어문제이다.

📖Problem

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

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

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, … z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

예제

1
2
intput : baekjoon
output : 1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

🔍Solve

  • 처음엔 아스키코드로 변환을 해서 비교해야 하나? 하고 접근을 하였으나 이중 for문을 사용해야 됐기 때문에 이 방법은 패스하였다.
  • 그래서 따로 계속 변환하여 비교하는 것이 아니라 알파벳 a~z까지의 값을 리스트(alphabets)로 저장하는 방법을 이용해 문제를 해결하였다.
    • 단어 s를 입력받는다.
    • alphabets에 알파벳을 a~z까지 저장한다.
    • 이후 alphabets를 a부터 z까지 s에 있는 알파벳을 인덱스로 접근해 비교한다.
      • si가 있다면, i인덱스에 해당하는 s로 접근한다. 이후 공백을 두어 출력해야 하므로 end=' ' 를 넣어준다.
      • 만약 없는 알파벳이라면 -1을 출력하고 공백(end=' ')으로 구분한다.
1
2
3
4
5
6
7
8
s = input()
alphabets = 'abcdefghijklmnopqrstuvwxyz'

for i in alphabets:
    if i in s:
        print(s.index(i), end=' ')
    else:
        print(-1, end=' ')
  • 새로 알게 된 것 : index()
    • index()는 해당하는 리스트 또는 문자열의 index에 접근할 수 있는 함수이다.

11720. 숫자의 합

백준브론즈4티어문제이다.

📖Problem

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

출력

입력으로 주어진 숫자 N개의 합을 출력한다.

예제 1

1
2
3
4
5
6
7
# input 
1
1

# output
1

예제 2

1
2
3
4
5
6
# input
5
54321

# output
15

예제 3

1
2
3
4
5
6
# input
25
7000000000000000000000000

# output
7

예제 4

1
2
3
4
5
6
7
# input
11
10987654321

# output
46

🔍Solve

간단한 문제이다.

  • 숫자의 개수는 int형인 num으로, 입력받는 숫자는 list형인 nums로 입력받는다.
  • 리스트에 있는 nums를 int형으로 형변환한 후, sum변수에 더한다.
1
2
3
4
5
6
7
8
num = int(input())
nums = list(input())
sum = 0

for i in nums:
    sum += int(i)

print(sum)
  • 이 문제의 경우, 정말 간단한 문제이다. 하지만 파이썬의 문법을 몰라서 for문 안에 int(i)를 해줘야 한다는 것을 몰라 한참을 헤맸다..
  • 그래도 이렇게 배워가서 다행이다.

11654. 아스키코드

📖Problem

알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

입력

알파벳 소문자, 대문자, 숫자 0-9 중 하나가 첫째 줄에 주어진다.

출력

입력으로 주어진 글자의 아스키 코드 값을 출력한다.

예제1

1
2
input : A
output : 65

예제2

1
2
input : C
output : 67

예제3

1
2
input : 0
output : 48

예제4

1
2
input : 9
output : 57

예제5

1
2
input : a
output : 97

예제6

1
2
input : z
output : 122

🔍Solve

이 문제를 선정한 이유 : 파이썬에서 아스키코드로 변환하는 것은 다른 C/C++과 같은 줄 알았으나 그게 아니었기 때문에 기억하기 위해 기록함

1
2
t = input()
print(ord(t))
  • 풀이는 간단하기 때문에 자세한 설명은 넘어가겠다. C/C++/JAVA는 형변환만 해주면 바로 아스키코드로 바뀐다. 하지만 파이썬에서는 새로운 함수를 사용해야 한다.
    • ord(문자) : 문자를 아스키코드로 반환해준다.
    • chr(숫자) : 숫자에 맞는 아스키코드로 반환한다.

💡Conclusions

  • 브론즈 문제를 꽤나 무시해왔는데, ‘의외로’ 어려운 문제도 있었다. 또 조금 더 기본을 탄탄히 할 수 있었다.
  • 단순히 티어를 올리기 위해 접근했던 방법이었으나 지금 이 시기에 잘 접한 것 같다고 생각한다.
  • 내 부족한 점을 더 잘 알 수 있게 되었다. 나는 특히 파이썬 문법에 너무 약하다. 또한, 파이썬을 이용하면 C나 C++을 이용해서 문제를 푸는 것보다 런타임이나 메모리도 많이 소요되고, 같은 내용을 담더라도 런타임에러나 시간초과가 뜬다. 그래서 당황스러웠었다. 그래서 파이썬을 이용한다면 파이썬 내장함수를 잘 알고 적재적소에 잘 써야 할 것 같다.
This post is licensed under CC BY 4.0 by the author.

LeetCode - 2522. Partition String Into Substrings With Values at Most K

백준 - 1655. 가운데를 말해요