[1427] 소트인사이드

해결 포인트

내림차순 정렬은 reverse = True를 사용하면 된다.

답안

a = list((input()))
b = []
a.sort(reverse=True)
for i in a:
    print(i,end="")

 

[11650] 좌표 정렬하기

해결 포인트

좌표 두개를 공백을 하나로 나누어 리스트x에 받으며 추가시킨다.

그럼 0,2,4,... 인덱스는 x

1,3,5,... 인덱스는 y가 된다.

기본 정렬만 시킨뒤 출력문 부분만 신경쓰면 된다.

답안

t = int(input())
x = []
for i in range(t):
    x.append(list(map(int,input().split())))
x.sort()
for j in range(len(x)):
    print(x[j][0],x[j][1])

[11651] 좌표 정렬하기 2

해결 포인트

이번 문제는 x가 아닌 y값을 기준으로 정렬해준다.

이와 관련된 sort함수 관련 문법을 알아보자

 

답안

t = int(input())
x = []
for i in range(t):
    x.append(list(map(int,input().split())))
x.sort(key=lambda x:(x[1],x[0]))
for j in range(len(x)):
    print(x[j][0],x[j][1])

sort 함수 안 문법을 익혀두자...

[1181] 단어 정렬

해결 포인트

데이터를 받는건 이전 문제들과 똑같다.

이후 우선 중복값을 제거 해주고 문제에서 요구하는 정렬을 하면된다.

답안

t = int(input())
x = []
x_n = []
for i in range(t):
    x.append((input()))

for k in x:
    if k not in x_n:
        x_n.append(k)

x_n.sort()
x_n.sort(key=len)

for j in x_n:
    print(j)

두번째 for문은 중복된 값을 제거하기 위함이다.

key = len는 길이에 따른 오름차순으로 정렬하게된다.

[10814] 나이순 정렬

해결 포인트

출력 잘되는데.... 자꾸 틀렸다고 나왔다....

문제점은 숫자와 문자형을 따로 구분해줘야한다는 점이다.

공백을 기준으로 데이터를 나눠 받은다음

리스트에 추가해줄땐 숫자는 int 시켜주자

답안

import operator
import sys
input = sys.stdin.readline()
t = int(input)
x = []
for i in range(t):
    age, name = sys.stdin.readline().split()
    x.append((int(age), name))
x.sort(key=lambda tag:tag[0])
for j in range(len(x)):
    print(x[j][0],x[j][1])

 

[2750] 수 정렬하기

해결 포인트

sort를 이용하면 쉽게 풀이 가능하다.

답안

a = int(input())
b = []
for i in range(a):
    b.append(int(input()))
b.sort()
for j in range(len(b)):
    print(b[j])

[2750] 수 정렬하기2

해결 포인트

이전문제랑 똑같지만 좀더 시간제한이 걸려있다...

최대한 코드를 최적화 해보자.

답안

import sys
a = int(sys.stdin.readline())
b = []
for i in range(a):
    b.append(int(sys.stdin.readline()))
for j in sorted(b):
    print(j)

readline은 필수인가 싶다.

그런데 여럿문제들을 풀다보면 가끔 해당 문법때문에 오류를 뿜는경우가있다.

또 파이썬 로직을 눈으로 쉽게 확인가능한 python tutor 에서는 지원하지 않는것 같다.

[25305] 커트라인

해결 포인트

쉽게 해결 가능하지만 힌트를 주자면
sort와 reverse를 이용하면 쉽게 출력 가능하다.

답안

n, k = map(int,input().split())
num = list(map(int,input().split()))
num.sort(reverse=True)
print(num[k-1])

[1978] 소수 찾기

해결 포인트

소수란... 1과 자기자신으로만 나울 수 있는 수를 말한다.

그럼 2부터 자기자신-1 까지 수를 돌리며 나눴을때 나머지를 확인하여 소수를 판별 한다는 것이 생각날것이다.

답안

a = int(input())
b = list(map(int,input().split()))
cnt = 0
def find(a):
  if(a<2):
    return False
  for i in range(2,a):
    if(a%i==0):
      return False
  return True
for j in b:
    if find(j):
        cnt += 1
print(cnt)

 

 

[2581] 소수

해결 포인트

이전 문제와 매우 유사하다.

range의 값을 조금 수정했고,

합은 sum

최솟값은 min을 이용하면 된다.

소수가 없을 경우까지 고려하여 구현했다.

답안

a = int(input())
b = int(input())
li = []
def find(v):
    if v < 2:
        return False
    for j in range(2,v):
        if v % j == 0:
            return False
    return True
for i in range(a,b+1):
    if find(i):
        li.append(i)
if len(li) != 0:
    print(sum(li))
    print(min(li))
else:
    print("-1")

[11653] 소인수분해

해결 포인트

소인수분해에 대해 수학적으로 우선 접근하여
로직을 생각해보자

답안

a = int(input())
b = 2
while a != 1:
    if a % b !=0:
        b += 1
    else:
        print(b)
        a = a/b

입력받은 a 값을 2로 나누어 나머지가 0일때 출력하고 그렇지 않다면 b를 +1시켜 다시 나눠 나머지를 확인한다.

나머지가 0이 돨때마다 a에는 a/b의 값을 다시 넣어줘야 한다.

 

[1929] 소수 구하기

해결 포인트

해당 문제는 시간 제한이 걸려있다.

아무리 머리를 쥐어짜도... 잘 생각이 안났고 sqrt 함수를 알게돠어 사용했다.

포문의 범위를 절반 이하로 줄여 시간 내에 해결 가능했다.

답안

import sys
import math
input = sys.stdin.readline()
a,b = map(int,input.split())
def find(v):
    if v < 2:
        return False
    for i in range(2,int(math.sqrt(v)+1)):
        if v % i == 0:
            return False
    return True
for j in range(a,b+1):
    if find(j):
        print(j)

import math가 필요하다.

기본 로직은 이전 문제들과 똑같으나...

for문 range를 살펴보면 math.sqrt(v)+1가 있다. 이는 정수 v의 제곱근을 수하는 함수이며

이를통해 for문 범위를 대폭 줄여 빠르게 계산이 가능하다.

 

점점 벽을 느끼고있다..

다시한번 기초문법을 공부할 예정이다...

긴 연휴가 끝나고 백수는 진짜 연휴가 시작된다...

이제 가을이 오려는지 날이 제법 쌀쌀해진듯하다.

문제를 풀수록 문법이 기본기가 중요하다는것을 느낀다.

백준 외로 코드업이란 사이트에서도 문제를 풀어볼 예정이다.

 

[10250] ACM 호텔

https://www.acmicpc.net/problem/10250

해결 포인트

층 마다 호실의 갯수가 최대 99개까지라고 정해져있다...

문제만 봤을땐 쉽게 이해하지 못할 수 있다.

예제 입력 예시를 한번 보자

2 		# 테스트 케이스
6 12 10 	# 402 출력 
30 50 72	#1203 출력

매층 1호실부터 채운다는 점을 고려하여 구현해보자.

답안

t = int(input())
for i in range(t):
    H, W, N = map(int,input().split())
    if  N%H == 0:
        print("{}".format(H*100 + (N//H)))
    else:
        print("{}".format((N%H)*100 + ((N//H)+1)))

테스트 케이스를 입력받고 이만큼 반복한다.

map함수를 이용해 한번에 데이터를 입력 받는다.

우선 else에 있는 출력문은 쉽게 구현 가능할 것이다.

그러나 6층, W개 방, 6명 이렇게 데이터를 입력하면 2가 출력될것이다.

이를 구현해줘야한다.

먼저 if 문으로 인원 / 층수의 나머지를 통해 걸러준 뒤 구현해주면 된다.

나머지가 0인 경우엔 항상 최고층에 배정 받게된다.

출력문에 *100은 문제에서 층별 방 갯수를 최대 99개로 제한 했기 때문이다.

 

[10757] 큰 수 A+B

해결포인트

readline을 이용하자

답안

import sys
a,b = map(int, sys.stdin.readline().split())
print(a+b)

 

[2292] 벌집

해결 포인트

시작(1)로부터 주위에 둘러싼 외벽의 방 갯수가 갖는 규칙을 찾아보면 쉽게 풀이 가능하다.

시작(1)은 방하나 그자제라고 생각하면된다.

답안

a = int(input())
if a == 1: # 처음 1은 방 한개 그 자체이다.
    print(a)
else: # 이후 외벽들은 6의 배수로 증가
    cnt = 1
    b = 1
    while b < a:
            b += cnt*6 # 벌집의 갯수를 파악하기위함
            cnt += 1 # 외벽의 갯수를 파악하기위함
    print(cnt)

a가 1인 경우 1개의 방 그 자체이기 때문에 시작으로 조건을 걸어준다.

이후 외벽 부턴 6의 배수로 증가한다는 점을 확인할 수 있다.
b에는 방의 갯수를 알기위해 6의 배수를 계속 더해 대입해주고

그때 마다 카운트를 통해 외벽의 갯수를 파악한다.

 

[2869] 달팽이는 올라가고 싶다

해결 포인트

로직 구현은 쉽게 가능할것이다...

그러나 문제는 시간초과이다.

for문 while문 반목문을 사용하면 안된다.

 로직을 간단하게 식으로 바꿔줘야한다.

답안

import sys
a,b,v = map(int,sys.stdin.readline().split())
cnt = (v-b)/(a-b) 
if cnt == int(cnt):
    print(int(cnt))
else:
    print(int(cnt)+1)

시간 제한이 걸려있기에 reline을 사용해줬다.

a = 올라감
b = 내려감

v = 총 높이

기본적으로는 v / a-b 를 떠오르겠지만 밤에 내려간다는것을 고려했을때 애초에 v(총 높이)에서 b(내려감)을 빼주고 시작하자.

나눗셈을 진행하면 소숫점이 나올것이다.

2.0 이면 2일 걸리는거지만 2.1은 3일 걸린다는것이다. int형으로 소숫점을 버리고 +1 시켰다.

 

오늘 카페가 너무 바빳다....

코딩할 시간이 없었다...

그래서 한문제다 ㅎㅎ

 

[1712] 손익분기점

해결 포인트

손익분기점에 대한 수학적 지식이 있으면 금방 해결할 수 있다.

손익분기점이 존재하지 않는경우는 -1을 출력하고 이외는

식을 통해 출력하면 된다.

답안

a,b,c = map(int,input().split())
if b>=c:
    print(-1)
else:
    print(int(a/(c-b))+1)

+ Recent posts