간단한 문제임에도 불구하고 계속 오류가 나서 이렇게 정리를 해본다.

문제는 다음과 같다.


우선 햇갈렸던 부분은 2가지였다.

1. 어떻게 입력값을 받는가 ===> 해결: 그동안 문제를 풀 때 항상 map(~)의 형태로 받다보니 list로 간단히 받을 수 있는 방법을 까먹었었다...

2. 계속 str[i] == '2'라는 line에서 오류가 났다. 오류 형태는 index out of range. 즉, 지정해준 배열의 크기보다 계속 크게 무언가를 처리하려고 한다는 뜻이다. ---> 해결: for문에서 range(str_len)을 실수로 range(str_len+1)로 처리를 했다. 그러다보니 str[i]는 계속 정해준 str_len보다 하나 큰 값까지 접근을 하려고 해서 결국 out of range가 발생하는 것이었다.

 

이 두 부분이 해결되니, 코드가 아주 잘 돌아갔다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
str_len = int(input())
str = list(input())
# print(str[1])
cnt_2 = 0
cnt_e = 0
for i in range(str_len):
    if str[i] == '2':  # 여기서 계속 문제가 발생한다... list index out of range계속 발생 --> 이유.. for문의 range에서 str_len+1로 처리를 했었다...
        cnt_2 = cnt_2 + 1
    elif str[i] == 'e':
        cnt_e = cnt_e + 1
if cnt_2 > cnt_e:
    print(2)
elif cnt_2 < cnt_e:
    print('e')
else:
    print("yee")
 
cs

 

 

출처: https://www.acmicpc.net/problem/17094

 

17094번: Serious Problem

2의 등장횟수가 더 많다면 2를 출력하고, e의 등장횟수가 더 많다면 e를 출력한다. 등장횟수가 같다면 "yee"를 출력한다. (큰 따옴표 제외)

www.acmicpc.net

 

계속 이런 형태의 문제에서 막히는 상황이 발생하고 있다.

그냥 간단하게 변수를 2개 만들고,

각각의 변수에 들어갈 수 있도록 split()을 사용하면 될 뿐이다.

아무래도 split()에 대해서 제대로 개념이 잡히지 않은 듯 하여 제대로 이번에 잡아봤다.

 

https://wikidocs.net/13#split

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

이 사이트는 점프 투 파이썬이라는 책의 사이트이다. 깔끔하게 정리되어있어 이렇게 한 번 정리를 할 겸 split 부분을 봤다.


split()

: a.split()처럼 괄호 안에 아무 값도 없으면 공백(스페이스, 탭, 엔터 등)을 기준으로 문자열을 나눈다.

: b.split(':')처럼 특정값을 괄호 안에 넣으면, 그 값(이 상황에서는 ':')을 기준으로 문자열이 나뉜다.


이제 위의 split을 사용해서 위의 문제를 푼 코드이다:

1
2
3
4
5
for i in range(int(input())):
    num, char = input().split()
    for j in range(int(num)):
        print(char, end='')
    print()
cs

 

다만 이 코드를 조금 더 짧고 빠르게 실행되도록 할 수 있는 방안을 다른 사람들이 맞춘 코드에서 찾을 수 잇었다.

바로 for문을 사용하지 않고 바로 처리해버리는 것이다.

가능한가 싶었는데... 충분히 가능했다. 

print문의 문자열처리에 대한 부분을 잘 공부해보도록 하자. (string * int ==> string string string ~~~ int만큼 반복)

따라서, 다음의 코드를 하면 훨씬 간단하게 풀 수 있다.

 


문제 자체는 간단한 구현 문제이다.

이 문제를 푸는 방법은 채점 현황에 따른 다양한 사람들의 풀이를 보니 (특히 시간이 나보다 빠른 사람들 것을 보았다), 특별히 눈에 띄었던 것을 배열을 사용하는 것이다.

이런 문제에서 배열사용하는 것 또한 내가 가장 좋아하는 방법인데, 파이썬을 사용하게 되면서 배열을 잘 사용하지 못하게 된 느낌이 든다.

따라서 내가 푼 방법과 배열을 활용하여 푼 방법을 정리해둔다.

 

내가 푼 코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apple_total = 0
banana_total = 0
for score in [321]:
    apples = int(input())
    apple_total = apple_total + score*apples
for score in [321]:
    bananas = int(input())
    banana_total = banana_total + score*bananas
 
if apple_total > banana_total:
    print('A')
elif apple_total < banana_total:
    print('B')
else:
    print('T')
cs

다음은 배열형태로해서 append를 통해 푼 코드:

1
2
3
4
5
6
7
8
9
arr=[]
for i in range(6):
  arr.append(int(input()))
d1 = arr[0]*3 + arr[1]*2 + arr[2]
d2 = arr[3]*3 + arr[4]*2 + arr[5]
= "T"
if d1 > d2 : s = "A"
elif d1 < d2 : s = "B"
print(s)
cs

 

 

 

출처: https://www.acmicpc.net/problem/17009

 

17009번: Winning Score

The first three lines of input describe the scoring of the Apples, and the next three lines of input describe the scoring of the Bananas. For each team, the first line contains the number of successful 3-point shots, the second line contains the number of

www.acmicpc.net

 


위와 같은 문제를 파이썬으로 풀고자 한다면 제대로 모듈을 알아야하나.

우선 datetime으로부터 가져오고, 그 안에서 datetime과 timedelta를 가져오도록 한다.

이후에, UTC+0을 기준으로 지금의 시간을 계산하기 위해서, 지금의 datetime을 구한 후, 그것을 서울(한국)과의 시차인 9시간을 빼면 된다.

 

그렇게 하면 다음과 같은 코드로 만들면 된다.

1
2
3
4
5
6
7
from datetime import datetime, timedelta
 
now = datetime.now() - timedelta(hours=9)
print(now.year)
print('%02d'%now.month)
print('%02d'%now.day)
 
cs

 

 

출처: https://www.acmicpc.net/problem/16170

 

16170번: 오늘의 날짜는?

지금 시각을 UTC+0(세계 표준시)을 기준으로 나타냈을 때의 연도, 월, 일을 한 줄에 하나씩 순서대로 출력한다.

www.acmicpc.net

 


크게 어려운 문제는 아닌 구현 문제이지만 이렇게 정리해서 올리는 이유는 반성을 위해서이다.

우선 내가 짠 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
num = list(map(int, sys.stdin.readline().split()))
count = len(num)
total = 0
for i in num:
    total = total + i
if total >= 100:
    print("OK")
else:
    if min(num) == num[0]:
        print("Soongsil")
    elif min(num) == num[1]:
        print("Korea")
    else:
        print("Hanyang")
cs

스스로 푼 것에 대해서 나름 뿌듯해하고 있었다. sys를 사용하기도 했고, 계속 햇갈리던 여러 값을 입력받기도 제대로 스스로 해내었기 때문이다.

그런데 알고보니 훨씬 코드를 짧게 쉽게 짤 수 있는 방법 있음을 알게 되었다.

그리고 그 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
a, b, c = map(int, input().split())
if a + b + c >= 100:
    print('OK')
else:
    if a<and a<c:
        print('Soongsil')
    elif b<and b<c:
        print('Korea')
    else:
        print('Hanyang')
cs

어느 것이 사실 더 간단한지는 모르겠지만, 내 눈에는 아래 것이 훨씬 간단해보였다.

만약 코딩테스트였다면 왠지 모르게 아래 것이 훨씬 빠르게 짤 것 같기는 하다.

아무튼 둘 다 잘 돌아가는 코드이고, 어느게 맞다 틀리다는 없긴 할테니 두 가지의 방법을 모두 알아두면 좋을 것 같긴 하다.

 

출처: https://www.acmicpc.net/problem/17388

 

17388번: 와글와글 숭고한

첫 번째 줄에 숭실대학교의 참여도, 고려대학교의 참여도, 한양대학교의 참여도를 의미하는 세 자연수 S, K, H가 공백으로 구분되어 주어진다. (0 ≤ S, K, H ≤ 100) 세 대학의 참여도는 모두 다르다.

www.acmicpc.net

 


이 문제는 정렬을 통해서 풀어보았다.

먼저 여러 숫자를 입력받기 위해서 list(map(int, (sys.stdin.readline()).split()))를 통해서 list를 형성한다.

 

그 후, copy()를 통해서 asc일 때와 desc일 때에 원본 입력값을 각각 저장한다.

이후, asc는 sort()해서 오름차순으로 정렬된 변수 하나, 그리고 desc를 sort(reverse=True)를 통해서 내림차순으로 정렬시킨 변수 하나를 생성한다.

 

이후에 if-else문을 통해서 원본 입력값과 비교를 통해서 오름차순/내림차순, 그리고 그 외의 형태인 mixed인지를 출력하도록 하였다.

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
num_original = list(map(int, (sys.stdin.readline()).split()))  # 잘 알아두자!!!! sys로 여러 개의 값을 입력받는 방법이다.
# print(num)
import copy
numSortAsc = copy.copy(num_original)
numSortDesc = copy.copy(num_original)
numSortAsc.sort()
numSortDesc.sort(reverse=True)
if num_original == numSortAsc:
    print("ascending")
elif num_original == numSortDesc:
    print("descending")
else:
    print("mixed")
 
cs

 

 

출처: https://www.acmicpc.net/problem/2920

 

2920번: 음계

다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8

www.acmicpc.net

 

이 문제의 경우 input()을 사용할 경우 계속 시간초과의 문제가 발생하였다.

먼저 문제는 다음과 같다.


주어진 입출력 예제가 빈약한데, 간단히 말해서 반복할 때마다 숫자를 입력하면, 그 숫자의 제곱값을 리턴하면 된다.

그래서 처음에는 다음과 같이 코딩을 하였다.

1
2
3
4
repeat = int(input())
for i in range(0, repeat):
    num = int(input())
    print(num**2)
cs

하지만 이렇게 하면 맨 처음에 언급했듯이 계속 시간초과라는 문제에 직면하게 된다.

그래서 결국 인터넷을 계속 검색했고, 딱 필요한 내용을 잘 정리한 블로그를 찾았다.

https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

 

여기에서 언급하듯이 "반복문으로 여러줄을 입력 받아야 할 때는 input()으로 입력 받는다면 시간초과가 발생"하는 경우가 생긴다.

때문에, 반복문으로 여러줄 입력받을 때는 sys.stdin.readline()를 사용하는 것이 바람직하다.

 

sys.stdin.readline()는 디폴트로 string형을 가진다. 또한, 한줄 단위로 입력받기 때문에 개행문자(\n)를 같이 입력 받는다.  따라서 다음과 같은 형태로 사용을 하면된다.

1
2
import sys
= int(sys.stdin.readline())
cs

 

**참고로 atom editor의 hydrogen plugin으로 프로그램을 실행하게 되면 계속 ValueError가 발생하게 된다. 

atom editor로 인해서 발생하는 에러

그런데 또 백준이나 repl.it, 혹은 command창으로 실행시키면 잘만 돌아간다. 

인터넷에서도 찾으면 spyder와 같이 되지 않는 경우도 있으니, 아마 시스템상으로 무언가가 있는 듯하다.

그러니 당황하지 말자!!


 

이렇게 해서 나온 제대로 된 답은 다음과 같다.

1
2
3
4
5
import sys
repeat = int(input())
for i in range(0, repeat):
    num = int(sys.stdin.readline())
    print(int(num)**2)
cs

 

 

매우 간단한 문제이다. 문제가 길어서 그렇지 그냥 간단한 if-else로 해결하는 구현문제.


다음과 같이 코드를 짜면 된다.

1
2
3
4
5
6
7
8
9
10
p_avg_case = int(input())
q_avg_newHospital = int(input())
 
if p_avg_case <= 50 and q_avg_newHospital <= 10:
    print("White")
elif q_avg_newHospital > 30:
    print("Red")
else:
    print("Yellow")
 
cs

 

 

출처: https://www.acmicpc.net/problem/20673

 

20673번: Covid-19

The input consists of two lines. The first line contains an integer p (0 ⩽ p ⩽ 1000), showing the average number of new cases per day in every one million population in Hana’s city over the past two weeks. The second line contains an integer q (0 ⩽

www.acmicpc.net

 

매우 간단하게 풀리는 문제

방법은 다양하지만, list를 사용해서 배열로 처리하였다.

일일이 변수에 각각의 값을 넣어서 print문 안에서 계산을 하는 형식보다 살짝 더 빠르다.


다음과 같은 코드로 나는 만들었다.

1
2
3
4
5
num = list(map(int,input().split()))
# print(num[2])
score = 56*num[0+ 24*num[1+ 14*num[2+ 6*num[3]
print(score)
 
cs

 

 

출처: https://www.acmicpc.net/problem/20254

 

20254번: Site Score

Teams from variaous universities compete in ICPC regional contests for tickets to the ICPC World Finals. The number of tickets allocated to every regional contest may be different. The allocation method in our super region, Asia Pacific, is based on a para

www.acmicpc.net

 

외계어로 된 문제라서 혹시 어려워하는 사람들을 위해서, 그리고 미래에 혹시나 볼 나를 위해서 문제를 정리해둔다.

참고로 언어는 포르투갈어라고 하는 것 같다.

포르투갈어 문제.. 번역을 안해준 백준...


이럴 땐 구글번역기가 최고다


문제는 굉장히 단순한 구현문제이다.

다음과 같이 하면 된다.

 

1
2
3
4
5
6
A, B = map(int, input().split())
if A == B:
    print(A)
else:
    print(max(A,B))
    
cs

 

+ Recent posts