1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

✏️ 내가 작성한 코드 - 1 (for문 2개 사용)

import sys
N = int(sys.stdin.readline().strip())
lst = []

for _ in range(N):
    n = sys.stdin.readline().strip()
    if n not in lst: # 중복 단어 안들어가게
        lst.append(n)

lst.sort() # 문자열 사전 순으로 정리 됨
lst.sort(key=len) # 원소들 길이별로 정리됨

for cha in lst:
    print(cha)

 

✏️ 내가 작성한 코드 - 2 (set() 사용)

import sys
N = int(sys.stdin.readline().strip())
lst = []

for _ in range(N):
    lst.append(sys.stdin.readline().strip())

lst = list(set(lst)) # 중복 제거 위해 set사용. sort위해 다시 list()로.
lst.sort()
lst.sort(key=len)

for cha in lst:
    print(cha)

 

✏️ 내가 작성한 코드 - 3 (set(),join() 사용)

import sys
N = int(sys.stdin.readline().strip())
lst = []

for _ in range(N):
    lst.append(sys.stdin.readline().strip())

lst = list(set(lst))
lst.sort()
lst.sort(key=len)

print('\n'.join(lst)) # join()함수 사용.

 

✏️ 참고

위에서부터 set(),join() 사용 / set() 사용 / for문 2개 사용 채점 결과다.

set(),join() 사용 시 시간이 더 줄어든 것을 확인할 수 있다.

 

sort()는 원소가 문자열일 때 사전 순으로 정렬해준다.

sort(key=len)은 원소들의 길이별로 정렬해준다

 

10817번: 세 수

첫째 줄에 세 정수 A, B, C가 공백으로 구분되어 주어진다. (1 ≤ A, B, C ≤ 100)

www.acmicpc.net

 

✏️ 내가 작성한 코드

import sys
num = list(map(int,sys.stdin.readline().strip().split()))
print(sorted(num)[1])

 

 

 

1026번: 보물

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거

www.acmicpc.net

 

✏️ 내가 작성한 코드

N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
sum = 0

A.sort()
B.sort(reverse= True) # 내림차순 정렬

for i in range(N):
    sum += A[i] * B[i]

print(sum)

 

✏️ 참고

A배열(재배열 가능)의 각 원소와 B배열(재배열 불가)의 각 원소들의 합(S)이 최솟값이기 위해서는

B배열의 원소가 클수록 A배열의 원소 중 가장 작은 값과 곱해야 한다.

따라서 B배열은 내림차순 정렬, A배열은 오름차순 정렬하여 서로 같은 인덱스끼리 곱한 다음 합치면된다.

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을

www.acmicpc.net

 

✏️ 내가 작성한 코드

N = int(input())
num = 0  # 들어온 순서 구분하기 위한 변수
memberList = []

for _ in range(N):
    member = list(input().split())
    num += 1 # 입력들어온 순서대로 num 증가하여 append
    member.append(num)
    memberList.append(member)

memberList.sort(key=lambda x: (int(x[0]), x[2]))  # 1. 나이를 기준으로 sort 2. 들어온 기준으로 sort

for mem in memberList:
    print(int(mem[0]), mem[1])
 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

✏️ 내가 작성한 코드

N = int(input()) # 배달해야할 설탕 무게
cnt = 0 # 필요한 봉지 개수

while(N>0):
    if N%5 == 0:
        N -= 5
        cnt += 1
    else:
        N -= 3
        cnt += 1

if N < 0: # 5,3으로 둘 다 나누어떨어지지않으면 N이 0으로 안끝나면서 마이너스가 됨.
    print(-1)
else:
    print(cnt)
 

11053번: 가장 긴 증가하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net

 

✏️ 내가 작성한 코드

N, A = int(input()), list(map(int,input().split()))

dp = [1]*N
for i in range(1,N): # dp[0]은 항상 1이므로 1부터 시작.
    for j in range(i):
        if A[j] < A[i]:
           dp[i] = max(dp[j]+1,dp[i])

print(max(dp))

 

✏️ 참고

dp 배열 : A[i]까지의 부분수열 최장길이를 dp[i]에 넣기 위한 것.

idx 0 1 2 3 4 5
A 10 20 10 30 20 50

A배열이 이렇게 존재하고 dp[3]을 구하려면?

 

1) A[0] 과 A[3]비교

→  A[3]더 크므로 dp[i] = max(dp[j]+1,dp[i]) 진행.

2) dp[3] = max(dp[0]+1,dp[3])

→  윗줄에서 A[0]보다 큰 걸 확인했으므로 A[0]의 dp값인 dp[0]보다 +1을 해주고, 현재 dp[3] =1 이랑 비교해서 max값을 dp[3]에 넣어줌

→  현재 dp[3] = 2

3) 다음 반복문 진행. A[1]과 A[3]비교 

→  A[3]더 크므로 dp[i] = max(dp[j]+1,dp[i]) 진행.

4) dp[3] = max(dp[1]+1,dp[3])

.

.

.

이런식으로 A[3]과 A[0], A[1], A[2]와 값의 크기를 비교해보고 해당 인덱스에 맞는 dp값을 비교해서 max로 뽑아오면 됨.

그럼 dp배열에는 A배열의 해당 인덱스까지의 최장 길이를 갖는 부분수열의 값들이 저장되고

거기서 또 max(dp)해서 가장 긴 값을 가져오면 된다.

 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

✏️ 내가 작성한 코드

import sys
N = sys.stdin.readline()
print(''.join(sorted(N,reverse=True)))

 

✏️ 참고

join함수 사용.

 ''.join(리스트) : 리스트 ['1','2','3'] 을 '123' 이렇게 문자열로 합쳐서 반환해준다.

ex. '#'.join(리스트) : 1#2#3 반환 -> ''사이에 구분자가 있으면 요소들 사이에 넣어서 반환함.

''.join(리스트) 이거는 구분자가 없으므로 공백으로 처리되어 123처럼 반환되는 것.

 

다른 사람 풀이를 확인하니 input()을 입력받고 int로 형변환하여 또 list로 변환하고 sort처리하던데

애초에 input으로 입력받으면 문자열이므로 형변환 필요가없다. 바로 sort처리 해주면됨. 

문자열이므로 리스트로 굳이 또 만들 필요도없다.

 

15969번: 행복

모든 서브태스크에서 2 ≤ N ≤ 1,000이고 입력되는 학생들의 점수는 0 이상 1,000 이하의 정수이다.

www.acmicpc.net

✏️ 내가 작성한 코드

import sys
N = int(sys.stdin.readline())
score = list(map(int,sys.stdin.readline().split()))
print(max(score)-min(score))

✏️ 참고

list에 담고 max,min 사용

+ Recent posts