문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!

치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.

전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.

인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.

A+ 4.5
A0 4.0
B+ 3.5
B0 3.0
C+ 2.5
C0 2.0
D+ 1.5
D0 1.0
F 0.0

P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.

과연 치훈이는 무사히 졸업할 수 있을까?

입력

20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.

출력

치훈이의 전공평점을 출력한다.

정답과의 절대오차 또는 상대오차가 10−4 이하이면 정답으로 인정한다.

제한

  • 1 ≤ 과목명의 길이 ≤ 50
  • 과목명은 알파벳 대소문자 또는 숫자로만 이루어져 있으며, 띄어쓰기 없이 주어진다. 입력으로 주어지는 모든 과목명은 서로 다르다.
  • 학점은 1.0,2.0,3.0,4.0중 하나이다.
  • 등급은 A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나이다.
  • 적어도 한 과목은 등급이 P가 아님이 보장된다.
score_dict = {"A+":4.5,
             "A0":4.0,
             "B+":3.5,
             "B0":3.0,
             "C+":2.5,
             "C0":2.0,
             "D+":1.5,
             "D0":1.0,
             "F":0.0}
total = 0
grade_total = 0

for my_score in range(20):
    subject, point, grade = input().split(" ")

    if grade != "P":
        grade_point = float(point)*score_dict[grade]
        grade_total += float(point)
        total += grade_point
print(total/grade_total)

 

입력하는 것이 공백으로 띄워져있다는 것을 발견했다면 의외로 쉬운 문제였던 것 같다. 

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 2566  (0) 2024.01.19
백준 파이썬 - 2738  (2) 2024.01.18
백준 파이썬 - 1316  (0) 2024.01.18
백준 파이썬 - 1157  (2) 2024.01.18
백준 파이썬 - 11718  (0) 2024.01.16

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

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

 

n = int(input())
x_list = []
cnt_list = []

for i in range(n):
    word = input()
    word_list = list(word)
    for j in range(len(word_list)):
        if j == (len(word_list)-1):
            break
        if word_list[j] == word_list[j+1]:
            target = word_list[j]
        else:
            target = word_list[j]
            if target in word_list[j+1::]:
                x_list.append(word)
                break
            else:
                pass
    cnt_list.append(word)
print(cnt_list)
print(x_list)
for x in x_list:
    if x in cnt_list:
        cnt_list.remove(x)

print(len(cnt_list))

 

이 문제는 솔직히 처음에 봤을 때 어떻게 같은 것끼리 모으고 중복하지 않는 걸 찾아내지..라는 생각이 앞섰다.

그래서 일단 무작정 문자열을 나눠서 쪼개는 것만 생각했다.

그렇게하면 뭔가 실마리가 보이지 않을까라는 생각이었다.

그래서 곰곰이 생각해보니 반복문으로 같은 것이 뒤에 나오면 break를 걸어주고 그에 해당하는 단어를 x_list에 넣어주면 어떨까라는 생각을 하였다.

 

그렇게 해주고 나중에 원래 리스트에서 x_list를 빼주고 난 다음에 그 리스트의 길이를 출력해주면 되지 않을까라는 생각이었는데 성공이었다. 근데 코드가 너무 길어서 다른 사람들은 어떻게 했는지 구경했다. 

 

N = int(input())
res = 0

for i in range(N):
    word = str(input())

    for i in range(len(word) - 1):
        if word[i] != word[i+1]:
            if word[i] in word[i+1:]:
                res += 1
                break
print(N - res)

 

나랑 생각이 비슷한 사람은 이렇게 코드를 만들었다.

5번째줄까지는 비슷한데 

그 이후부터는 다르다.

len(word)-1 을 통해서 마지막에 숫자가 포함되지 않는걸 피해주고

word[i]와 word[i+1]이 같지 않으면 word[i] 이후의 문자열이 word[i]를 포함하는지 확인하고

포함한다면 res를 더해주는 형식이다.

그리고 마지막에 입력해준 문자열의 개수에서 res를 빼주어 답을 출력한다.

 

생각이 유연해야할 것 같다.. 하하

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 2738  (2) 2024.01.18
백준 파이썬 - 25206  (0) 2024.01.18
백준 파이썬 - 1157  (2) 2024.01.18
백준 파이썬 - 11718  (0) 2024.01.16
백준 파이썬 - 1152  (0) 2024.01.16

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

 

s = input().upper()
s_list = list(set(s)) # 중복없는 리스트 만들어주기

cnt_list = []  # 합계 목록

for x in s_list:
    cnt = s.count(x)
    cnt_list.append(cnt)

if cnt_list.count(max(cnt_list)) > 1:
    print("?")
else:
    print(s_list[cnt_list.index(max(cnt_list))])

 

처음에 합계 목록까지 만들어줘야한다는 생각을 하고 어떻게 그럼 각각의 문자의 개수를 세지라고 생각을 했다. 

그래서 이중반복문으로 해줬는데 코드도 길어지고 헷갈려서 그만뒀다.

도저히 안되겠다 싶어서 구글링하니 count()를 통해 리스트의 요소들의 개수를 셀 수 있다는 걸 알게되었다.

나도 알고 있었는데 잘 사용하지 않아서 까먹었는데 이제라도 알았으니 앞으로 안 잊어야겠다.

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 25206  (0) 2024.01.18
백준 파이썬 - 1316  (0) 2024.01.18
백준 파이썬 - 11718  (0) 2024.01.16
백준 파이썬 - 1152  (0) 2024.01.16
백준 파이썬 - 2675  (0) 2024.01.16

문제

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

입력

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

출력

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

예제 입력 1 

Hello
Baekjoon
Online Judge

예제 출력 1 

Hello
Baekjoon
Online Judge

 

 

그대로 출력하면 된다고해서 단순히

print(input())

 

했는데 틀렸다.ㅋㅋㅋ

지금 생각해도 웃기네

이 한 줄 코드로 끝낼거면 문제를 안 냈을 거 같다는 생각에 다시 문제를 봤다.

보니깐 여기서는 우리가 몇 번 입력할 지에 대한 얘기가 전혀없었다. 

그래서 어떻게 하면 되지.. 라는 생각에 구글링을 통해 찾아보니

while True:
    try:
        print(input())
    except EOFError:
        break

 

이렇게 하면 된다고 한다.

보고 바로 이해했는데

이게 while True로 얼마든지 입력을 받을 수 있게 하고

try except 구문을 통해 언제 멈출지 정해줄거다.

그런데 여기서 만약에 사용자의 입력이 멈추면 이 반복문도 그만해야하기에

EOFError(End of file error)를 걸어준다.

 

이게 정답이라고 한다.

다른 코드도 있는데

 

import sys

words = sys.stdin.readlines()
for word in words:
	print(word.rstrip())

 

이게 더 효율적이라고 한다.

반복문으로 여러 줄 입력을 받는 상황에서는 반드시 sys.stdin.readline()을 사용해야 시간초과가 생기지 않는다고 한다.

sys.stdin.readline() 사용법은 따로 다시 공부해서 올려야겠다.

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 1316  (0) 2024.01.18
백준 파이썬 - 1157  (2) 2024.01.18
백준 파이썬 - 1152  (0) 2024.01.16
백준 파이썬 - 2675  (0) 2024.01.16
백준 파이썬 - 10809  (0) 2024.01.15

문제

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

입력

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

출력

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

 

예제 입력 1 

The Curious Case of Benjamin Button

예제 출력 1 

6

 

 

처음에 문제보고 너무 쉬워서 

a = input().split()
print(len(a))

 

하고 넘어가려고 했는데  이 코드가 틀려서 '뭐지' 하고 문제 다시 보니깐 

앞 뒤에 공백이 들어갈 수 있다고 한다.

그래서 앞뒤 공백 없애주는 strip() 사용하기로 하고 

아래와 같이 고쳐주니

a = input().strip().split()
print(len(a))

 

정답이었다.

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 1157  (2) 2024.01.18
백준 파이썬 - 11718  (0) 2024.01.16
백준 파이썬 - 2675  (0) 2024.01.16
백준 파이썬 - 10809  (0) 2024.01.15
반복문을 사용한 정육면체 만들기  (1) 2024.01.15

문제

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

입력

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다. 

출력

각 테스트 케이스에 대해 P를 출력한다.

 

예제 입력 1 

2
3 ABC
5 /HTP

예제 출력 1 

AAABBBCCC
/////HHHHHTTTTTPPPPP

 

 

나의 정답

n = int(input())

for i in range(n):
    x, y = map(str, input().split())
    for j in y:
        print(j*int(x), end = "")
    print()

 

이번 문제 보면서 나누기만 하면 되겠다고 생각했다.

문자열을 split()함수로 나눠주고 반복문을 통해 하니씩 출력해주면 답이 나올 것이라고 생각했다.

 

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 11718  (0) 2024.01.16
백준 파이썬 - 1152  (0) 2024.01.16
백준 파이썬 - 10809  (0) 2024.01.15
반복문을 사용한 정육면체 만들기  (1) 2024.01.15
RGB to HEX  (1) 2024.01.15

문제

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

입력

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

출력

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

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

import string
x = input()

alphabet_lower = string.ascii_lowercase

for i in range(len(alphabet_lower)):
    if alphabet_lower[i] in x:
      print(x.index(alphabet_lower[i]), end = " ")
    else:
      print(-1)
import string
alphabet_upper = string.ascii_uppercase
print(alphabet_upper)

 

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 1152  (0) 2024.01.16
백준 파이썬 - 2675  (0) 2024.01.16
반복문을 사용한 정육면체 만들기  (1) 2024.01.15
RGB to HEX  (1) 2024.01.15
백준 파이썬 - 문자열 1  (1) 2023.11.21
n = int(input())

print(' '*(n+1) + '+' + '-'*n + '+')

for i in range(n, 0, -1):
  print(' '*i + '/' + ' '*n + '/' + ' '*(n-i) + '|')

print('+' + '-'*n + '+' + ' '*(n) + '+')

for i in range(n, 0, -1):
  print('|' + ' '*n + '|' + ' '*(i-1) + '/')

print('+' + '-'*n + '+')

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 2675  (0) 2024.01.16
백준 파이썬 - 10809  (0) 2024.01.15
RGB to HEX  (1) 2024.01.15
백준 파이썬 - 문자열 1  (1) 2023.11.21
백준 파이썬 - 배열 2  (2) 2023.10.03
r = int(input())
g = int(input())
b = int(input())

print(f"#{r:02X}{g:02X}{b:02X}")
  1. r = int(input()): 사용자로부터 정수를 입력받아 변수 r에 저장. 
  2. g = int(input()): 사용자로부터 정수를 입력받아 변수 g에 저장.
  3. b = int(input()): 사용자로부터 정수를 입력받아 변수 b에 저장.
  4. print(f"#{r:02X}{g:02X}{b:02X}")는 입력받은 RGB 값을 16진수로 변환하여 문자열로 출력. :02X는 각 값을 두 자리 16진수로 표현하도록 하는 포맷 코드. 예) "#FF00AA"

'알고리즘' 카테고리의 다른 글

백준 파이썬 - 10809  (0) 2024.01.15
반복문을 사용한 정육면체 만들기  (1) 2024.01.15
백준 파이썬 - 문자열 1  (1) 2023.11.21
백준 파이썬 - 배열 2  (2) 2023.10.03
백준 파이썬 - 배열  (0) 2023.09.16

27866

S = input()
i = int(input())

print(S[i-1])

 

 

2743

x = input()

print(len(x))

 

 

9086

문제

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

입력

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

출력

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

T_num = int(input())

for i in range(T_num):
    munja = input()
    print(f"{munja[0]}{munja[-1]}") # -1은 가장 끝 첫번째를 나타냄.

 

 

11654

print(ord(input()))

 

 

11720

문제

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

입력

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

출력

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

n1 = input() 
n2 = input()

hap = 0

for i in range(int(n1)):
    hap = hap + int(n2[i])
    
print(hap)

 

 

이 문제 처음 봤을 때는 input으로 받아와서 (input으로 받으면 문자열 처리된다.) split 해서 하나하나씩 더해주면 되겠다고 생각했는데 띄어쓰기와 같은 구분자가 없어서 당황했다. 그런데 그냥 문자열을 인덱싱해서 하나하나씩 int 처리해주면 전체 합을 구할 수 있겠다고 생각했었고 실제로 돌려보니 정답이었다. 

'알고리즘' 카테고리의 다른 글

반복문을 사용한 정육면체 만들기  (1) 2024.01.15
RGB to HEX  (1) 2024.01.15
백준 파이썬 - 배열 2  (2) 2023.10.03
백준 파이썬 - 배열  (0) 2023.09.16
백준 파이썬 - 2525  (0) 2023.07.06

+ Recent posts