코딩에 대해 아주 약간 감을 익혀...

토이프로젝트를 준비하고자한다..

내가 하고 싶은건 앱개발자인데 대기업은 요즘 안드로이드, ios 따로 두지만 스타트업의 경우 같이 개발하는 개발자를 구한다고 하니... 크로스플랫폼을 다루려고한다.

여럿 툴이 있지만 플러터를 준비하려고한다.

클론코딩을 시작으로 내가 만들고자 하는 앱을 조금씩 구체화 시키고자한다.

코테 준비는 조금 줄이고 플러터에 몰두할것이다.

[10828] 스택

해결 포인트

명령 입력 줄을 보면 명령어 + 숫자로 구성되어있는데 이를 리스트에 넣어 인덱스 0번에 있는 명령어(str) 값을 if문을 통해 구분하여 구현하면 된다.

답안

import sys
t = int(sys.stdin.readline())
li = []
for i in range(t):
    a = list(sys.stdin.readline().split())
    if a[0] == "push": # 명령어(str) 값 구분
        li.append(a[1])
    elif a[0] == "pop":
        if len(li) == 0:
            print(-1)
        else:
            print(li.pop())
    elif a[0] == "size":
        print(len(li))
    elif a[0] == "empty":
        if len(li) == 0:
            print(1)
        else:
            print(0)
    elif a[0] == "top":
        if len(li) == 0:
            print(-1)
        else:
            print(li[-1])

[10773] 제로

해결 포인트

입력값이 0일때와 아닐때 나누어 처리하면 쉽게 구현 가능하다.

답안

import sys
a = int(sys.stdin.readline())
num = []
for i in range(a):
    b = int(sys.stdin.readline())
    if b != 0:
        num.append(b)
    else:
        num.pop()
print(sum(num))

[2920] 음계

해결 포인트

이정도는 뭐,,,,

답안

import sys
li = ['1','2','3','4','5','6','7','8']
li2 = ['8','7','6','5','4','3','2','1']
x = list(sys.stdin.readline().split())
if x == li:
    print("ascending")
elif x == li2:
    print("descending")
else:
    print("mixed")

 

[2164] 카드 2

해결 포인트

import sys
a = int(sys.stdin.readline())
li = []
for i in range(1,a+1):
    li.append(i)

while len(li) > 1:
    li.pop(0)
    li.append(li[0])
    li.pop(0)

print(li[0])

위와 같은 코드로 구현을 했지만,, 시간초과....

나같은 코린이한테 너무 많은걸 요구한다 백준..

인터넷 검색 결과

import deque를 이용하면 시간 효율적으로 풀이 가능하다...

답안

import sys
from collections import deque

li = deque()
a=int(sys.stdin.readline())

for i in range(1,a+1):
    li.appendleft(i) # 1 ~ a+1 까지 차례대로 추가

while len(li) > 1: # 리스트의 길이에 따른 반목문
    li.pop()
    li.rotate(1) # 인덱스 값들을 왼쪽으로 하나 이동

print(li[0])

 

오늘 정말 많은 문제를 구현했지만 대부분 시간초과로 인해 정답처리 되지 못했다...

코린이에게 너무 많은것을 요구하는거 아닌가..

아직 많이 부족한만큼 더 공부해야겠다.

[2577] 숫자의 개수

해결 포인트

 a in b 와 count  함수를 사용하면 쉽게 풀이 가능하다.

답안

num = []
sum = 1
for i in range(3):
    num = int(input())
    sum = sum * num
sum = str(sum)
for j in range(10):
    print(sum.count(str(j)))

 

 

[2839] 설탕 배달

해결 포인트

최소한의 수량으로 배달하는게 포인트다.

우선적으로 5를 나눴을때 나누어떨어지는지 보고
3을 한번씩 빼주며 계산하면 쉽게 풀이 가능하다.

답안

num = int(input())
cnt = 0
while num >= 0:
    if num % 5 == 0:
        cnt += num // 5
        print(cnt)
        break
    num -= 3
    cnt += 1
else:
    print(-1)

while문을 통해 num이 0이상일때 반복시키며

5로 나눴을때 나눠떨어지면 몫을 카운트 및 출력하고

그렇지 않을 경우 -3 시키며 다시한번 5로 나눴을때 살펴보는 로직이다.

 

 

[10872] 팩토리얼

해결 포인트

쉽다.....

답안

import sys
input = sys.stdin.readline()

num = int(input)
result = 1

for i in range(1,num+1):
    result *= i

print(result)

 

 

[2558] A+B -2

해결 포인트

 

답안

num = int(input())
num2 = int(input())
print(num+num2)

 

 

[10870] 피보나치 수5

해결 포인트

0과1이 들어간 리스트를 하나만들어주고

해당 인덱스 n n+1를 더한 값을 append 시켜주면 쉽게 풀이 가능하다.

답안

num = int(input())
cnt = 0
li = [0,1]
for i in range(num):
    li.append(li[i]+li[i+1])
print(li[num])

 

 

[1085] 직사각형에서 탈출

해결 포인트

x,y,w,h 포인트중 x와 w  그리고 y와 h 이렇게 쌍을 이루어
태두리에 닿을때를 고민하며 로직을 구현하면 된다.

이해가 어려우면 좌표를 그려보자

답안

x,y,w,h = map(int,input().split())
li = [w - x, x, h-y, y]
print(min(li))

리스트에 들어간 값은 태두리에 닿았을때의 값들이라고 생각하면 된다.

이중 최솟값을 찾는것이니 min함수를 이용하면 된다.

 

 

[2609] 최대공약수와 최소공배수

해결 포인트

math 함수를 공부하면 쉽게 풀이 가능하다.

답안

import math
a,b = map(int, input().split())
print(math.gcd(a,b))
print(math.lcm(a,b))

사실 함수 없이 수학적 논리로 구현하는것이 더 좋겠지만...

편한방법이 있으니,,,

 

 

[10039] 평균 점수

해결 포인트

데이터를 입력받을때 조건문을 통해

40점 미만 점수를 거르면 쉽게 풀이 가능하다.

답안

num = []
for i in range(5):
    a = int(input())
    if a < 40:
        num.append(40)
    else:
        num.append(a)
print(int(sum(num)/len(num)))

 

[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)

 

+ Recent posts