문제

<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

예를 들어, 다음과 같이 81개의 수가 주어지면

 1열2열3열4열5열6열7열8열9열1행2행3행4행5행6행7행8행9행
3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 31 12 29 29 80

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

 

 

 

이 문제 솔직히 행렬적으로 안 풀어도 된다고 생각해서 

large_dict = {}

for i in range(1,10):
    num_list = list(map(int, input().split(" ")))
    value = max(num_list)
    key = num_list.index(value)
    large_dict[key] = value

rev_large_dict = dict(map(reversed, large_dict.items()))
l = list(rev_large_dict.keys())
print(max(l))
print(l.index(max(l))+1,rev_large_dict[max(rev_large_dict)]+1)

 

 이렇게 이중반복문 안쓰고 풀었다가 틀렸다.

근데 이렇게해도 출력값이랑 같게 나오는데..

아마 문제에서 요구하는 이중반복문을 쓰지 않아서 틀린 것 같다.

(혹시 아시는 분 있다면 알려주시면 감사드리겠습니다!)

 

그래서 정답은 이것이다. 

all_list = []

for i in range(9):
    num_list = list(map(int, input().split()))
    all_list.append(num_list)

result = all_list[0][0]
row = 0
column = 0
for x in range(9):
    for y in range(9):
        if all_list[x][y] > result:
            result = all_list[x][y]
            row = x
            column = y
            
print(result)
print(row+1, column+1)

 

처음에 제일 마지막 코드를 print(x, y)로 했는데

8,8 이렇게 나와서 당황했는데 

이렇게 나오는 게 당연한게 반복문을 다 돌은 값을 내가 출력했기 때문에 저렇게 나오는게 당연했다.

 

그래서 처음에 row = 0 / column = 0이라고 설정해놓고 최댓값이 나오면 그것의 행과 열의 번호를 기억하도록 시켰다.

그러니 정답이였다. 

 

행렬은 무조건은 아니지만 이중반복문을 권장해서 쓰도록 하자 흠흠 

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

백준 파이썬 - 2563  (0) 2024.01.24
백준 파이썬 - 10798  (0) 2024.01.19
백준 파이썬 - 2738  (2) 2024.01.18
백준 파이썬 - 25206  (0) 2024.01.18
백준 파이썬 - 1316  (0) 2024.01.18

문제

N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.

입력

첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

출력

첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.

 

n, m = map(int, input().split())
first_matrix = []
second_matrix = []

for i in range(n):
    f = list(map(int, input().split()))
    first_matrix.append(f)
    
for i in range(n):
    s = list(map(int, input().split()))
    second_matrix.append(s)

for i in range(n):
    for j in range(m):
        result = first_matrix[i][j] + second_matrix[i][j]
        print(result, end = " ")
    print()

 

이중으로 리스트 돼있는 것은 [ ] [ ] 이렇게 접근을 해야하는데

이걸 까먹어서 조금 헤맸던 문제였다.

그렇게 어려운 문제는 아닌 것 같다.

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

백준 파이썬 - 10798  (0) 2024.01.19
백준 파이썬 - 2566  (0) 2024.01.19
백준 파이썬 - 25206  (0) 2024.01.18
백준 파이썬 - 1316  (0) 2024.01.18
백준 파이썬 - 1157  (2) 2024.01.18

문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 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

+ Recent posts