input()을 통해서 풀어도 되긴 하지만, 백준의 채점 프로그램으로 인해서 input()을 시간초과가 계속 나오게 된다.

이럴 때는 sys.stdin.readline()를 사용해야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
 
for _ in range(3):
    N = int(sys.stdin.readline())
    sum = 0
    for i in range(N):
       num = int(sys.stdin.readline())
       sum = sum + num
    
    if sum > 0:
        print("+")
    elif sum < 0:
        print("-")
    else:
        print("0")
cs

 

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

 

1247번: 부호

총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1≤N≤100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거나

www.acmicpc.net

 


문제 자체는 쉬우나, 백준의 채점프로그램상 그냥 while True를 사용하면 런타임 에러(EOFError)가 발생한다.

 

이런 경우, try-except를 사용해서 에러에 대한 예외처리를 해줄 수 있다

 

1
2
3
4
5
while True:
    try:
        print(input())
    except EOFError:
        break
cs

 

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

 

11718번: 그대로 출력하기

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시

www.acmicpc.net

 


수학과 관련된 문제이기도 하기 때문에 공식을 조금 찾아보기도 해야하긴 하다.

그래도 제대로 수학적인 공식만 사용한다면 쉬운 문제이다.

1
2
3
4
diagnol, height, width = map(int, input().split())
 
res = diagnol / (height**2 + width**2)**0.5
print(int(height*res), int(width*res))
cs

# 10진수 --> 2 / 8 / 16진수로 변환하기 (1)

파이썬에서는 bin(), oct(), hex()를 통해 이를 쉽게 해결한다.

대신 이 함수들을 통해서 변환을 할 경우,

bin(2진수)는 숫자 앞에 0b가 붙게 된다.

oct(8진수)는 숫자 앞에 0o가 붙게 된다.

hex(16진수)는 숫자 앞에 0x가 붙게 된다.

이런 식으로 나오게 된다.


# 10진수 --> 2 / 8 / 16진수로 변환하기 (2)  --- 앞의 0b, 0o, 0x 지우기

간단한 방법은 print문에서 [2:]로 처리하는 것이다.

[2:]를 통해 0b,0o,0x를 없앴다.

 

또 하나의 방법은 format을 통해서 바꾸는 방법이다.

format을 통해서 바꾼 첫번째 방법이다. 
format을 통해서 바꿀 수 있다.

 

 

{:#b}의 형태로  문자열에 넣은 뒤, format()을 통해서 변환을 하도록 한다. 이 때, [2:]를 통해서 앞의 0b를 출력하지 않도록 처리한다.

 

 

 

 

 

 

 


# n진수 --> 10진수로 변환하기

10진수로 표현하는 방법은 간단하다.

int(string, base)의 형태로 하면 된다.

string은 숫자(값)가 들어가고, base는 string에 입력한 값이 몇진법인지 들어간다.

2, 3, 4, 5, 6, 16진수를 10진수로 바꾸었다.

 


# 참고로, 10진수를 n(2, 8, 16외)진수로 바꾸기 위해서는 직접 변환하는 코드를 작성해서 처리를 해야한다.

매우 간단해 보이지만 틀리고 고민을 꽤 한 문제이다.

이 문제의 핵심은 floating point error이다.

이 문제에서 파이썬을 사용해서 계속 오답이 나온다면 그것은 파이썬의 // 연산자를 사용해야 하기 때문일 것이다.


파이썬에서 // 연산자란?

파이썬에서 나누기 연산 후, 소수점 이하의 수를 버리고 정수 부분의 수만 구한다.

 

print(int(int(N)*int(M)/2))     VS    print(int(int(N)*int(M)//2))

값이 커질수록 서로 결과값이 다르게 나온다.

예를 들어, 999999993 999999993 값을 입력시킨다면 답이 다르게 나올 것이다.

/를 사용하면 : 499999993000000000
//를 사용하면 : 499999993000000024

 

따라서, 위의 문제에 상응하는 답을 가지기 위해서는 //를 사용해야 한다.

1
2
N, M = input().split()
print(int(int(N)*int(M)//2)) 
cs

 

출처: https://www.acmicpc.net/board/view/48568

 

글 읽기 - 최대개수를 잘못 구했나요오오오...

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 



 

1
2
3
4
5
6
kda = list(map(int, input().split('/')))
if ((kda[0+ kda[2]) < kda[1]) or (kda[1== 0):
    print("hasu")
else:
    print("gosu")
 
cs


간단한 문제이다

대신 문제를 잘 읽자

출력을 보면 3명 사이에 나눠져야 한다고 되어있다. 예제입력 1 때문에 햇갈려서 처음에 틀렸다 허허

암튼, 코드는 다음과 같이 하면 된다.

1
2
3
4
5
6
7
8
9
10
contest_num = int(input())
prize = list(map(int, input().split()))
sum = 0
for i in range(contest_num):
    sum = sum + prize[i]
if sum % 3 != 0:
    print("no")
else:
    print("yes")
 
cs

 

 

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

 

20332번: Divvying Up

A solid competitive programming team can rack up a lot of prize money. Knowing how strong your team is, you are certain to win a lot of contests, so you had better sit down now and check that everybody will receive the same fair distribution of winnings. Y

www.acmicpc.net

 


문제가 살짝 이상한 감이 없잖아 있다. 입력 부분의 설명이 조금 불친절하다랄까.

첫 번째 입력 T(test case)가 살짝 설명이 이상하다고 느낄 수 있는데, T는 무시가 되는 것이 아니라 2번과 나머지 입력값에 대해서 반복을 몇 번 할 것인가에 대한 입력값이다.

코드를 보면 더 잘 이해가 갈 것으로 생각된다.


1
2
3
4
5
6
7
test_case = int(input())
for i in range(test_case):
    problems = int(input())
    for j in range(problems):
        numbers = list(map(int, input().split()))
        print(numbers[0]+numbers[1], numbers[0]*numbers[1])
 
cs

 

 

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

 

18398번: HOMWRK

In one of the beautiful cities of Afghanistan two sisters are going to program a simple game to help them solve their mathematics homework. Their homework asks them to calculate the sum and multiplication of two numbers. Your task is to help them to build

www.acmicpc.net

 

list 초기화에 대해서 아직도 제대로 모르고 있어서 계속 해매었던 문제이다.

list에 대한 초기화만 제대로 안다면 구현을 하는 논리는 간단하다고 볼 수 있다.

일단 문제는 다음과 같다.

문제는 상황설명까지 있어서 어려워보이지만 간단하다.

첫 번째 입력은 반복횟수이다.

그리고 나서 반복횟수만큼 음이 아닌 정수를 입력한다. 이 때, 반복횟수 이후 처음으로 입력된 정수가 기준이 되어서, 이 값이 다른 입력된 숫자들 중에 가장 크면 S를 출력하고, 그렇지 않으면 N을 출력한다.


내가 문제되었던 부분은 바로 list의 초기화이다.

list 초기화에 대해서 이참에 정리를 하고 가고자 한다.

우선 list를 만드는 방법은 간단하다.

변수 = list() 라고 하거나, 변수 = [] 로 하면 된다.

여기서부터 중요하다. list의 초기화가 필요하다. 0으로 초기화를 하고자하면 3가지의 방법이 존재한다.

1번 방법: V = [0*i for i in range(N)]  #for문을 통해서 크기가 N인 리스트에 각각 0을 대입하는 것이다.

2번 방법: V = [0]*N  #딱 보기에도 직관적이고 간단한다. 0을 크기가 N만큼 만드는 것이다.

3번 방법: V = [0 for _ in range(N)]  #이 또한 1번 방법과 비슷한데 조금 더 간단하다고 볼 수 있다. 모든 N에 0을 대입한다는 의미를 가진다.

 

 


 이렇게 해서 다음과 같은 코드를 생성하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
= int(input())
# V = [0*i for i in range(N)] # 더 좋은 list 초기화 방법 = [0]*N으로 한다.
# V = [0 for _ in range(N)]
= [0]*N
for i in range(N):
    V[i] = int(input())
    # print(V[i])
for j in range(N):
    if V[0!= max(int(V[0]), int(V[j])):
       res = 'N'
       break;
    else:
        res = 'S'
print(res)
 
cs

 

 

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

+ Recent posts