문제

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.

예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.

n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

입력

입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)

입력의 마지막엔 -1이 주어진다.

출력

테스트케이스 마다 한줄에 하나씩 출력해야 한다.

n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).

이때, 약수들은 오름차순으로 나열해야 한다.

n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.

예제 입력 1 복사

6
12
28
-1

예제 출력 1 복사

6 = 1 + 2 + 3
12 is NOT perfect.
28 = 1 + 2 + 4 + 7 + 14

 

 

내가 한 틀린 코드

nl = []
ll = []

while True:
    n = int(input())

    if n == -1:
        break
        
    l = []
    
    for i in range(1,n+1):
        if n % i == 0:
            l.append(i)

    l.remove(l[-1])
    ll.append(l)
    nl.append(n)

for j in range(len(ll)):
    if nl[j] == sum(ll[j]):
        print(f"{nl[j]} = ", end = "")

        for k in ll[j]:
            if k == 1:
                print(f"{k}", end = "")

            else:
                print(f" + {k}", end = "")
    else:
        print()
        print(f"{nl[j]} is NOT perfect.")

 

이 코드는 정답이랑 똑같은 형식으로 출력되기는 하는데

출력되는 형식이 이렇게 되면 안되기 떄문에 틀린 문제이다.

한 줄에 하나씩 출력되도록 해야하는데 그렇게 하지 않았기에 틀린문제

 

그럼 어떻게 해야하나?

옛날에 썼던 적이 있는 것 같은데 요즘 안써서 까먹은 join을 써야한다.

join을 통해 반복문 사이에 있는 인자들을 +로 연결해준다는 생각을 해주면 이렇게 길게 코드를 쓰지 않아도 된다.

 

정답 코드

nl = []
ll = []

while True:
    n = int(input())

    if n == -1:
        break
        
    l = []
    
    for i in range(1,n+1):
        if n % i == 0:
            l.append(i)

    l.remove(l[-1])
    ll.append(l)
    nl.append(n)

for j in range(len(ll)):
    if nl[j] == sum(ll[j]):
        temp = ' + '.join(str(i) for i in ll[j])
        print(f"{nl[j]} = {temp}")

    else:
        print(f"{nl[j]} is NOT perfect.")

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

백준 파이썬 - 2869  (0) 2024.02.02
백준 파이썬 - 2292  (0) 2024.01.30
백준 파이썬 - 2903  (1) 2024.01.30
백준 파이썬 - 2720  (1) 2024.01.29
백준 파이썬 - 2745  (1) 2024.01.29

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

예제 입력 1 복사

2 1 5

예제 출력 1 복사

4

예제 입력 2 복사

5 1 6

예제 출력 2 복사

2

예제 입력 3 복사

100 99 1000000000

예제 출력 3 복사

999999901

 

 

 

내가 실패한 답들 

A,B,V = map(int, input().split())

now = 0
day = 0

while True:
    now += A
    day += 1
    if now >= V:
        break
    else:
        now -= B

print(day)

 

A,B,V = map(int, input().split())
tot = A-B

now = 0
day = 0

while True:
    now += tot
    day += 1
    if V == now + A or V <= now + A:
        day += 1
        break
        
print(day)

 

출력은 되는데 모두 시간초과로 인해 실패하였다.

 

그래서 알고리즘 분류가 수학으로 돼있어서

x를 다 올라가는 횟수라하고 x-1을 내려가는 횟수라고 해서

식을 세우니 아래와 같은 결과가 나왔다.

 

Ax - B(x - 1) = V

Ax - Bx + B = V

(A - B)x = V - B

X = (V - B)/(A - B)

 

그래서 이걸 바탕으로 코드를 만들었다.

import math

A, B, V = map(int, input().split())
day = (V-B) / (A-B)
print(math.ceil(day))

 

ceil을 한 이유는 올림을 해줘야 우리가 원하는 답이 나오기 때문이다.

예를 들어 day의 값이 5.6이 나오면 5가 답이 아닌 6이 답이 나와야 하기 때문이다. 

 

앞으로 실행시간도 신경써서 코드를 만들어야겠다는 생각을 하게 되는 문제였다. 

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

백준 파이썬 - 9506  (1) 2024.02.02
백준 파이썬 - 2292  (0) 2024.01.30
백준 파이썬 - 2903  (1) 2024.01.30
백준 파이썬 - 2720  (1) 2024.01.29
백준 파이썬 - 2745  (1) 2024.01.29

벌집

문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

입력

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

출력

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.

예제 입력 1 복사

13

예제 출력 1 복사

3

 

 

정답코드

N = int(input())
first_interval = 1
answer = 1

while True:
    if N == 1:
        print(answer)
        break
    else:
        last_interval = first_interval + 6 * answer
        if N in range(first_interval, last_interval + 1):
            answer += 1
            print(answer)
            break
        else:
            answer += 1
            first_interval = last_interval

 

최소 개수의 방을 지나야한다.

그래서 나는 벌집 모양의 수들이 어떤 관계를 이루고 있는지 확인하였다. 

확인한 결과 1 밑에 2번 그리고 시계 방향으로 수가 증가한다. 

7에서 8로 넘어갈 때 회전하는 층이 바뀐다. 그림으로 설명하면 이렇다. 

1 - 7 - 19 - 37 - ... 이런 식으로 간격이 6 X 1, 6 X 2, 6 X 3 ... 이렇게 증가하는 걸 확인할 수 있다. 

그래서 구간을 1 ~ 7, 7 ~ 19, 19 ~ 37... 이런 식으로 잡을 수 있도록 변수를 설정해주었다. 

 

코드 설명

1.

N = int(input())
first_interval = 1
answer = 1

 

N에는 구하려는 숫자를 입력한다.

그리고 처음에 있는 숫자방인 1을 first_interval로 잡아준다.

숫자방 1에 있을 때도 방을 거친 것이 되기 때문에 초기값을 answer = 1로 잡아준다. 

 

2.

while True:
    if N == 1:
        print(answer)
        break
    else:
        last_interval = first_interval + 6 * answer
        if N in range(first_interval, last_interval + 1):
            answer += 1
            print(answer)
            break
        else:
            answer += 1
            first_interval = last_interval

 

N이 만약에 1이라면 그냥 출력할 수 있도록 한다.

그게 아니면 last_interval을 설정하여 거치는 방의 횟수를 구할 수 있도록 한다.

예를 들면 1 ~ 7의 범위 안에 숫자가 있는지 확인하고 있다면 방을 한번 더 거친 것이기 때문에 

answer에 1을 더할 수 있도록 한다.

그러고 난 다음에 print(answer)을 한다. 

 

1 ~ 7의 범위 안에 없다면 다음 범위로 넘어가야 하기 때문에 else 을 통해 다음 범위로 넘어갈 수 있도록 한다. 

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

백준 파이썬 - 9506  (1) 2024.02.02
백준 파이썬 - 2869  (0) 2024.02.02
백준 파이썬 - 2903  (1) 2024.01.30
백준 파이썬 - 2720  (1) 2024.01.29
백준 파이썬 - 2745  (1) 2024.01.29

문제

상근이는 친구들과 함께 SF영화를 찍으려고 한다. 이 영화는 외계 지형이 필요하다. 실제로 우주선을 타고 외계 행성에 가서 촬영을 할 수 없기 때문에, 컴퓨터 그래픽으로 CG처리를 하려고 한다.

외계 지형은 중앙 이동 알고리즘을 이용해서 만들려고 한다.

알고리즘을 시작하면서 상근이는 정사각형을 이루는 점 4개를 고른다. 그 후에는 다음과 같은 과정을 거쳐서 지형을 만든다.

  1. 정사각형의 각 변의 중앙에 점을 하나 추가한다.
  2. 정사각형의 중심에 점을 하나 추가한다.

초기 상태에서 위와 같은 과정을 한 번 거치면 총 4개의 정사각형이 새로 생긴다. 이와 같은 과정을 상근이가 만족할 때 까지 계속한다.

상근이는 어떤 점은 한 개 보다 많은 정사각형에 포함될 수 있다는 사실을 알았다. 메모리 소모량을 줄이기 위해서 중복하는 점을 한 번만 저장하려고 한다. 과정을 N번 거친 후 점 몇 개를 저장해야 하는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 15)

출력

첫째 줄에 과정을 N번 거친 후 점의 수를 출력한다.

 

 

정답 코드 

N = int(input())
init = 2

for i in range(N):
    init = init + 2 ** i

res = init ** 2
print(res)

 

규칙을 잘 찾으면 바로 답이 나오는 문제 

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

백준 파이썬 - 2869  (0) 2024.02.02
백준 파이썬 - 2292  (0) 2024.01.30
백준 파이썬 - 2720  (1) 2024.01.29
백준 파이썬 - 2745  (1) 2024.01.29
백준 파이썬 - 2563  (0) 2024.01.24

문제

미국으로 유학간 동혁이는 세탁소를 운영하고 있다. 동혁이는 최근에 아르바이트로 고등학생 리암을 채용했다.

동혁이는 리암에게 실망했다.

리암은 거스름돈을 주는 것을 자꾸 실수한다.

심지어 $0.5달러를 줘야하는 경우에 거스름돈으로 $5달러를 주는것이다!

어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.

거스름돈의 액수가 주어지면 리암이 줘야할 쿼터(Quarter, $0.25)의 개수, 다임(Dime, $0.10)의 개수, 니켈(Nickel, $0.05)의 개수, 페니(Penny, $0.01)의 개수를 구하는 프로그램을 작성하시오. 거스름돈은 항상 $5.00 이하이고, 손님이 받는 동전의 개수를 최소로 하려고 한다. 예를 들어, $1.24를 거슬러 주어야 한다면, 손님은 4쿼터, 2다임, 0니켈, 4페니를 받게 된다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 거스름돈 C를 나타내는 정수 하나로 이루어져 있다. C의 단위는 센트이다. (1달러 = 100센트) (1<=C<=500)

출력

각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.

예제 입력 1 복사

3
124
25
194

예제 출력 1 복사

4 2 0 4
1 0 0 0
7 1 1 4

 

 

내가 만든  정답 코드

T = int(input())
Q = 25
D = 10
N = 5
P = 1

Q_list = []
D_list = []
N_list = []
P_list = []

for i in range(T):
    C = int(input())
    Quarter = C // Q
    Dime = (C - Quarter * Q) // D
    Nickel = (C - Quarter * Q - Dime * D) // N
    Penny = (C - Quarter * Q - Dime * D - Nickel * N) // P
    Q_list.append(Quarter)
    D_list.append(Dime)
    N_list.append(Nickel)
    P_list.append(Penny)

for i in range(T):
    print(f"{Q_list[i]} {D_list[i]} {N_list[i]} {P_list[i]}")

 

 

다른 사람들의 코드 

n = int(input())

for _ in range(n):
	money = int(input())
	for i in [25, 10, 5, 1]:
		print(money//i, end=' ')
		money = money%i

 

 

다른 사람들이 쓴 코드는 내가 일일이 복잡하게 모든 걸 쓴 코드에 비해 훨씬 간결하다.

여기서 보면 나는 25,10,5,1을 처음에 변수를 통해 설정해준 반면에 여기서는 리스트를 통해 반복문을 돌게 하여 나누도록 하였다. 내가 124에서 100을 빼고 20을 빼고 하는 식으로 코드를 짰는데 굳이 이렇게 안하고 124를 25로 나누고 10으로 나누고 각각 한 몫을 구해서 출력하도록 했으면 더 좋았을 것 같다. 

 

 

사람들 말로는 이 문제가 전형적인 그리드 문제라고 한다. 

그리드가 뭔지 몰라서 나는 찾아봤다. 

 

그리디 알고리즘(욕심쟁이 알고리즘, Greedy Algorithm)이란 "매 선택에서 지금 이 순간 당장 최적인 답을 선택하여 적합한 결과를 도출하자"라는 모토를 가지는 알고리즘 설계 기법이다.[1]

 

그리디 알고리즘 - 나무위키

그리디 알고리즘(욕심쟁이 알고리즘, Greedy Algorithm)이란 "매 선택에서 지금 이 순간 당장 최적인 답을 선택하여 적합한 결과를 도출하자"라는 모토를 가지는 알고리즘 설계 기법이다.[1] 예를 들

namu.wiki

 

이거 보면서 생각난게 머신러닝의 가지치기 기법인데 혹시 연관이 있나 싶다. 

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

백준 파이썬 - 2292  (0) 2024.01.30
백준 파이썬 - 2903  (1) 2024.01.30
백준 파이썬 - 2745  (1) 2024.01.29
백준 파이썬 - 2563  (0) 2024.01.24
백준 파이썬 - 10798  (0) 2024.01.19

문제

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

예제 입력 1 복사

ZZZZZ 36

예제 출력 1 복사

60466175

 

 

정답 코드

num_list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

N, B = input().split()
answer = 0
for i, num in enumerate(N[::-1]):
    answer += int(B) ** i * num_list.index(num)

print(answer)

 

설명

1. 진법을 변환하기 위한 num_list 설정

2. N,B를 통해 입력받기

3. answer을 통해 구하려는 진법의 값을 받을 수 있는 변수 설정

4. 반복문 설정 

 4-1. 이때 N[::-1]을 하는 이유는 ZZZZZ가 입력된다고 하면 제일 앞에 있는 Z가 36**4*35를 받아야하기 때문

5. 출력

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

백준 파이썬 - 2903  (1) 2024.01.30
백준 파이썬 - 2720  (1) 2024.01.29
백준 파이썬 - 2563  (0) 2024.01.24
백준 파이썬 - 10798  (0) 2024.01.19
백준 파이썬 - 2566  (0) 2024.01.19

문제

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

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

입력

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

출력

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

 

예제 입력 1 

3
3 7
15 7
5 2

예제 출력 1 

260

 

 

 

array = [[0 for j in range(100)] for i in range(100)]
n = int(input()) # 색종이의 수 

for i in range(n):
    x1, y1 = list(map(int, input().split()))

    for x in range(x1, x1+10):
        for y in range(y1, y1+10):
            array[x][y] = 1

res = 0
for k in range(100):
    res += array[k].count(1)

print(res)

 

처음에는 길이가 겹치는 부분을 어떻게 하지 해서 전부 다 구해서 빼면 되나 했는데

너무 코드가 길어져서 패스했다.

그래서 다른 사람들이 한 것을 보니 

1. 10X10의 0으로 채운 정사각형을 만든다.

2. 색종이의 수를 받는다.

3. 색종이의 수만큼 수를 받아준다.

4. 그리고 해당하는 칸을 0에서 1로 만들어준다.(array[x][y])

5. 그리고 그 1을 모두 세어준다.

 

이렇게 하면 겹치는 부분의 넓이를 쉽게 구할 수 있다.

데이터 쌓았으니 다음 번에 써먹을 수 있도록 한번 더 연습해야겠다. 

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

백준 파이썬 - 2720  (1) 2024.01.29
백준 파이썬 - 2745  (1) 2024.01.29
백준 파이썬 - 10798  (0) 2024.01.19
백준 파이썬 - 2566  (0) 2024.01.19
백준 파이썬 - 2738  (2) 2024.01.18

문제

아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다. 

이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다. 

A A B C D D
a f z z 
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x

<그림 1>

한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다. 

심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다. 

그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:

Aa0aPAf985Bz1EhCz2W3D1gkD6x

칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.

입력

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.

출력

영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다. 

 

x_list = []
result = ""

for i in range(5):
    x = input()
    x_list.append(x)

max = 0
for x in x_list:
    if len(x) > max:
        max = len(x)

for i in range(max):
    for j in range(5):
        try:
            result += x_list[j][i]
        except:
            pass

print(result)

 

try, except 구문을 통해서 str out of range 오류를 피해주면

완성된다. 근데 너무 코드가 길다. 다른 사람 것도 보면 좋을 거 같은데 

 

text = []
for i in range(5):
	text.append(input())
    
for i in range(max(len(e) for e in text)):
	for j in range(5):
    	if i < len(text[j]):
        	print(text[j][i], end = '')

 

간단하긴한데 나랑 했던 코드 논리랑 차이는 없다.

그러나 코드가 짧아지고 가독성이 좋으면 효율적이니 

연습을 많이 해야겠다!

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

백준 파이썬 - 2745  (1) 2024.01.29
백준 파이썬 - 2563  (0) 2024.01.24
백준 파이썬 - 2566  (0) 2024.01.19
백준 파이썬 - 2738  (2) 2024.01.18
백준 파이썬 - 25206  (0) 2024.01.18

문제

<그림 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

+ Recent posts