< 백준 10951 > 😑


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





그렇다고 내가 풀 수 있는건 아니다.  ㅎㅎ


< 실패한 내 코드 >

1
2
3
4
5
6
7
8
9
check = True
A, B = map(int, input().split())

while check:
    if [A, B] != None:   #입력값을 받은 경우: 
        print(A+B)
        A, B = map(int, input().split())  
        if [A, B] is None: #입력값 받지 않은 경우
            check = False  

일단 위와 같은 코드를 짰으나 런타임 에러가 떴다.


그리하여

1
2
3
4
5
6
7
while True:
    A, B = map(int, input().split())
    if [A, B] != None:
        print(A+B)
        A, B = map(int, input().split())
    elif [A, B] is None:
        break

이런 코드를 짜봤지만 역시나 런타임 에러.


혹시 ' 0 < A, B < 10 ' 이 조건을 만족해야하나 싶어서

1
2
3
4
5
6
7
A, B = map(int, input().split()) 

while 0 < A < 10 and 0 < B < 10:
    print(A+B)
    A, B = map(int, input().split()) 
    if 0 >= A or A >= 10 or 0 >= B or B >= 10:
        break

위 코드를 시도해봤지만, 역시나 런타임 에러다.

위 코드들의 문제점은 loop를 끝내주지 못한다는 것이고, loop를 끝내지 못하는 이유는 테스트 케이스 개수가 정해져 있지 않기 때문이다.  

이 경우 어찌해야 할 지 내 머리로는 알 수가 없어서 그냥 구글 슨생님에게 물어봤다.

검색해보니, 테스트 케이스 개수가 정해지지 않은경우 EOF(End of File)을 만날 때까지 while문을 반복하게 하면 된다.


아래는 검색해서 찾은 < 정답 코드 >

1
2
3
4
5
6
try:
    while True:
        A, B = map(int, input().split()) 
        print(A+B)
except : # 예외 경우 즉, EOF(End Of File)을 만난 경우 
    exit() # 프로그램 종료

예외처리를 숙지하고, 다른 날 새 마음으로 다시 풀어보자




< 백준 10818 > 😀




이 문제는 첫 제출에서 '맞았습니다'를 받았다.

1
2
3
N = int(input())
L = list(map(int, input().split())) 
print(sorted(L)[0], sorted(L)[-1])

코드 설명 :

1번 항에서 입력 값 N을 받아, 그 다음 줄에서 N개 만큼 입력 값을 더 받아야 한다.
2번 항은 '특정 개수만큼 입력 값을 받는' 코드다. 자주 쓰이는 것 같으니까 잘 봐두자.



< 백준 2562 >  😀


문제 : 
9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수
3, 29, 38, 12, 57, 74, 40, 85, 61
이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.


비교적 수월하게 풀었다. 

< 정답인 내 코드 > 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
d = dict() #{인덱스 넘버:정수}

for i in range(1, 10): 
    d[i] = int(input())
    
print(sorted(d.values())[-1])

for j, n in d.items():
    if sorted(d.values())[-1] == d.get(j):
        print(j)

코드 설명 :

- 먼저 dict( ) 함수를 이용해서 {인덱스 넘버 : 정수} 와 같이 key, value를 가진 딕셔너리 d를 만든다.
- 9개의 입력값을 하나씩 받아 빈 딕셔너리 d를 하나씩 채워주는 방식으로 d를 완성시킨다.


- 6번 항이 좀 복잡해보이는데, 9개의 서로 다른 자연수들 중 최댓값을 찾기 위해 d.values()를 작은 순서대로 sorted 하고, [-1] 인덱스로 가장 마지막 값 즉, 가장 큰 값을 호출한 것이다.

- 8번 항부터 시작하는 for 문은 딕셔너리에서 특정 항목의 값으로 해당 항목 값의 키 값을 찾는 방법이다. 여러모로 유용할 것 같으니 잘 기억해두자.


< 다른 사람의 코드 >

검색해보니 더 간단하게 푸는 방법도 많다.
내가 한 것처럼 딕셔너리를 만드는 게 아니라 그냥 리스트에서 인덱스를 찾는 방법이다.

다음은 UC공대 출신 미국에서 살아남기 님의 코드를 가져온 것이다.


1
2
3
4
5
6
num_list = []
for i in range(9): #0~8까지 총 9개  
    num_list.append(int(input()))

print(max(num_list)) #최댓값 구하는 함수 max()
print(num_list.index(num_list)+1) #0부터 시작하니 인덱스 값에 1을 추가


index( ) 함수 설명

출처: 위키닥스 <점프 투 파이썬>

< 백준 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번 쓰였다.


나름 수월하게 풀었다.


< 내 코드 > 


1
2
3
4
5
6
7
A = int(input())
B = int(input())
C = int(input())
s = str(A*B*C)

for i in range(0, 10):
    print(s.count(str(i)))

문제에서 A, B, C를 각 줄에 따로 입력하라고 했기 때문에 map( ) 을 쓰지 않는다.
또 곱셈을 하기 위해 int로 바꿔줬던 것을 곱셈 후 결과값 s가 된 후 다시 문자열(str)으로 바꿔줬다.



< 백준 3052 > 😀




< 내 코드 >


1
2
3
4
5
remain = []
for i in range(10):
    n = int(input())
    remain.append(n%42)
print(len(set(remain)))


코드 설명 :

나머지 값들이 모인 remain 리스트를 만들어 출력하면 [39, 40, 41, 0, 1, 2, 40, 41, 0, 1] 이다.
40, 41, 0 등이 중복으로 등장한다.

문제에서 '서로 다른 값'이 몇 개 있는지 구하라고 했으므로 리스트 내 중복 항목을 지우는 게 관건이다.

중복을 지우기 위해 5번 항에서 set( ) 함수를 써서 집합으로 변환시켰다. 집합에는 중복 값이 존재하지 않으므로 자연스럽게 중복을 지울 수 있다.