클래스에서 상속, __init__, super(), 그리고 self 관련해서 복습했다.

(https://www.youtube.com/watch?v=uIcK7-YU8uA)

좋은 자료나 강의들이 짤막하게 파트별로 있어서 찾아서 공부하기 좋은 듯.


10952 - A + B - 5

(https://www.acmicpc.net/problem/10952)

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

입력의 마지막에는 0 두 개가 들어온다.

출력

각 테스트 케이스마다 A+B를 출력한다.


틀렸던 코드

1
2
3
4
5
6
while True:                             #반복한다
    A, B = map(int, input().split())    #A, B를 입력받는다.
    print(A+B)                          #A+B를 출력한다.
    
    if (A & B) == 0:                    #A와 B가 0이라면
        break                           #반복을 멈춘다.
cs

왜 틀렸는지 찾아봤는데, 마지막 줄은 처리하지 않아야해서 틀렸다고 한다.

이 코드대로 진행한다면 0, 0을 입력받고 프린트를 한 다음 멈추기 때문에 틀렸던 것 같다.

 

맞힌 코드

1
2
3
4
5
6
7
8
while True:                         #반복한다
    A, B = map(int, input().split())#A, B를 받는다.
    
    if (A | B) != 0:                #A 또는 B가 0이 아니라면       
        print(A+B)                  #A+B를 출력한다.
    
    else:                           #그게 아니라면(A와 B가 0이라면)
        break                       #멈춘다.
cs


10951 - A + B - 4

(https://www.acmicpc.net/problem/10951)

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

각 테스트 케이스마다 A+B를 출력한다.


 틀렸던 코드

1
2
3
4
5
6
7
8
while True:                         #반복한다
    A, B = map(int, input().split())#A, B를 받는다.
    
    if (A | B) != 0:                #A 또는 B가 0이 아니라면       
        print(A+B)                  #A+B를 출력한다.
    
    elif (A | B) == None:
        break
cs

try, except 개념을 모르는 상태에서 어떻게든 비벼보려고 한 흔적..

맞힌 코드

1
2
3
4
5
6
7
try:
    while True:                         #반복한다
        A, B = map(int, input().split())#A, B를 받는다.
        print(A+B)
    
except:
    exit()
cs

while이 밖에, try, except가 안으로 들어가게 짜는 방법도 있었다.

내 기억 상 기초 강의 때 예외처리로 잠깐 배웠던 것 같은데 기억이 안나서 찾아봤다.



1110 - 더하기 사이클

(https://www.acmicpc.net/problem/1110)

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다.

새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

 

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력

첫째 줄에 N의 사이클 길이를 출력한다.

 

예제

26 -> 4

55 -> 3

1 -> 60

0 -> 1

71 - 12


맞힌 코드

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
#더하기 사이클
N1 = input()                                                #변수 N1을 입력받는다.
 
if int(N1) < 10:
    N1 = '0' + N1                                           #만약 N1이 10보다 작다면, 0+N1 꼴로 만들어준다.
    
N2 = N1[1+ str(int(N1[0]) + int(N1[1]))                   #N1의 일의 자리를 십의 자리로, N1의 각 자릿수의 합을 이어 붙인다. (N1이 26이라면, 2 + 6 = 8 이므로 N2 = 68)
if len(N2) == 3 :                                           #만약 그 값이 100을 넘어간다면,(N1이 68이라면, 6 + 8 = 14이고, N2 = 814가 됨)
            N2 = N1[1+ str(int(N1[0]) + int(N1[1]))[1]    #N2는 N1의 뒷자리, 그리고 그 합의 뒷자리를 붙인 값이 된다. (N1이 68일 때 N2 = 84)
else:
    N2 = N2
 
count = 1                                                   #사이클 횟수인 count 변수를 선언해준다. / 이미 N1 -> N2를 거쳤기 때문에 1로 시작한다.
 
while True:                                                 #반복한다.
    count += 1                                              #count를 세준다.
    N2 = N2[1+ str(int(N2[0]) + int(N2[1]))               #N1을 변환한 N2를 또 다시 변환하므로 변수로 지정해준다.
    
    if len(N2) == 3:                                        #만약 N2가 세 자리라면,(N2 = 84 / 8 + 4 = 12이므로 N2' = 412)
        N2 = N2[0+ N2[2]                                  #N2'의 백의 자리 4(N2의 일의 자리)와 N2'의 일의 자리 2(N2 각 자릿수 합의 뒷자리)를 붙인다.
         
    else:
        N2 = N2                                             #N2가 세 자리 수가 아니라면 그대로 유지한다.
        
    if N1 == N2:                                            #N2가 반복문을 거쳐 N1과 동일해졌다면
        break                                               #반복문을 마친다.
 
if N2 == '00':                                              #N1이 0이어서 N2가 00이었다면, 00 = 0 이므로 한 번 셌다고 정해준다.
    count = 1
 
print(count)                                                #사이클 횟수를 출력한다.
cs

다른 사람들 코드길이 100~400B 인데 나혼자 2000B 넘어감 ㅋㅋ

 

근 한 시간 가까이 머리 싸매면서 지우고 고치고를 반복했던 것 같다.

하다가 방법이 막히는 것 같거나 오류가 뜨면 천천히 주석을 달아가면서 검토했다.

예시 입력에서 0을 입력하면 출력이 2가 나왔는데(1이 나와야 함)

그럼 내 코드가 잘못된 거라는 생각이 들었어야 했는데, 그냥 0을 예외적인 케이스로 해결했다.

 

맞고 나서 정말 짜릿하고 좋았는데..

그런데..


남의 코드

(https://sso-feeling.tistory.com/371)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
N = int(input())  #값 입력받음  N = 26
num = N           #변하는 값    num = N
count = 0         #사이클 횟수  

while True:       #반복한다
    a = num//10   #a는 num을 10으로 나눈 몫     a = 2   / 10으로 나눈 몫 = 십의 자리 수
    b = num %10   #b는 num을 10으로 나눈 나머지 b = 6   / 10으로 나눈 나머지 = 일의 자리 수
    c = (a+b)%10  #c는 a+b를 10으로 나눈 나머지 c = 2 + 6 / 각 자리 수의 합의 일의 자리 수
    num = (b*10) + c  #num = (6*10) + (2+6) = 68 / 십의 자리 수 + 각 자리수 합의 일의 자리 수
    count += 1    
    if(num == N):
        break

print(count)
cs

간결하다.

수학적 사고가 부족했던 것 같다.

이러면 0의 케이스도 해결이 될텐데.

문자열로 해결하는 문제라고 생각했는데, 정수형으로도 충분했다.

까비~

 



10818 - 최소, 최대

(https://www.acmicpc.net/problem/10818)

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.


틀린코드

1
2
3
4
= int(input())
lst = input().split()
 
print(min(lst), max(lst))
cs

vscode라 다른건가..?

알아서 숫자 스플릿해서 집어 넣으면 list 타입으로 되던데.. 정답이 안 됐었다.

 

맞힌 코드

1
2
3
4
5
= int(input())
lst = list(map(int, input().split()))
 
print(min(lst), max(lst))
 
cs


2562 - 최댓값

(https://www.acmicpc.net/problem/2562)

문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

출력

 

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.


틀린 코드

1
2
3
4
5
6
7
8
lst = []
 
for i in range(9):
    a = int(input())
    lst.append(a)
 
print(max(lst))
print(lst.index(max(lst)))
cs

맞힌 코드

1
2
3
4
5
6
7
8
lst = []
 
for i in range(9):
    a = int(input())
    lst.append(a)
 
print(max(lst))
print(lst.index(max(lst))+1)
cs


2577 - 숫자의 개수

(https://www.acmicpc.net/problem/2577)

문제

세 개의 자연수 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
5
6
7
8
9
10
= int(input())   
= int(input())
= int(input())
 
ABC = str(A*B*C) 
 
for i in range(010):
    print(ABC.count(str(i))) #문자열 특정 문자 수 세기 .count()
 
 
cs


3052 - 나머지

(https://www.acmicpc.net/problem/3052)

문제

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

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

입력

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

출력

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


맞힌 코드

1
2
3
4
5
6
7
8
9
lst = []
 
for i in range(10):
    a = int(input())
    lst.append(a%42)
 
set1 = set(lst)
 
print(len(set1))
cs

분명 맞혔는데 왜 자꾸 틀렸다고 하지..? 하다가 발견했다.

마지막 줄에 print를 안 넣었었다..

 


 

4번 테마의 4번째까지 총 38개 풀었어.

앞으로 347개의 문제가 남았어. (9.9%) - 10% 달성!

 

복사했습니다!