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 사용

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

✏️ 1번째 코드 - 메모리초과(실패)

# sorted 사용

N = int(input())
lis = []
for _ in range(N):
    num = int(input())
    lis.append(num)

for number in sorted(lis):
    print(number)

 

✏️ 2번째 코드 - 메모리초과(실패)

# input() -> sys.stdin.readline() 변경

import sys
N = int(sys.stdin.readline())
lis = []
for _ in range(N):
    num = int(sys.stdin.readline())
    lis.append(num)

for number in sorted(lis):
    print(number)

 

✏️ 3번째 코드 - 성공

# 계수정렬 활용

import sys
N = int(sys.stdin.readline())
nlist = [0]*(10000 + 1)

for _ in range(N):
    nlist[int(sys.stdin.readline())] += 1

for i in range(len(nlist)):
    if nlist[i] != 0:
        for num in range(nlist[i]):
            print(i)

✏️ 풀이

- 입력받는 리스트 nlist의 길이를 고정한다. 

- 숫자입력될때마다 그 숫자에 해당하는 nlist의 인덱스의 갑을 1 증가시킨다.

  ex. 2 2 2 3 1 이렇게 입력한다면

  nlist=[0,1,3,1] # 해당숫자 인덱스랑 입력값 일치시키기위해 nlist길이를 입력값+1만큼 정해놨던것.

- nlist를 순회하며 출력하는데 값이 0이면 입력한적 없다는것이므로 0이아닐때만 for 돌면서 해당 '인덱스'값을 출력

✏️ Static (정적인,고정의) :

- java 코드 상에서 모든 객체가 공유할 수 있다는 의미를 가지고 있다.

- JVM에서 메모리에 딱 한번 올라가 고정적으로 할당되며, 프로그램이 종료될 때 해제된다.

- 객체를 선언하지 않아도 접근할 수 있다.

예시)

public class Test {
 
    public static void test1() {
        System.out.println("test1");
    }
 
    public void test2() {
        System.out.println("test2");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Test.test1(); // 사용 가능
        Test.test2(); // 사용 불가능
 
        Test test = new Test();
        test.test1(); // 사용 불가능
        test.test2(); // 사용 가능
    }
}

 

✏️ 장점 : 

- 생성 할때마다 메모리가 올라가는 것이 아니라, 고정 메모리이므로 효율적이다.

- 객체를 생성하지 않고 접근하기때문에 참조속도가 빠르다. (사용을 안하고 있어도 메모리에 잡히기 때문이다. 반대로 객체생성으로 만들어진 인스턴스는 GC(Garbage Collecion)에 의해 소멸된다.)

 

✏️ 단점 :

- 무분별한 사용은 메모리 낭비를 발생할 수 있다.

- 값이 자주 바뀌는 객체를 Static으로 사용할 경우 공유자원이므로 예상치 못한 오류가 발생하여 디버깅이 힘들어질 수 있다.

 

✏️ Static을 효율적으로 사용하기 :

- 공유하는 값에 사용

- 절대적으로 변하지 않는 값인 경우 final과 함께 사용한다. (ex. 하루인 24시간, 파이값 등)

 

✏️ Static은 객체 생성 없이 공유하며 사용해 메모리를 효율적으로 사용할 수 있지만 무분별한 사용은 비효율적인 상황을 발생시킬 수 있다.

 

'Java' 카테고리의 다른 글

[Java] Reflection API  (0) 2024.02.18
[Java] Iterator, Enumeration  (0) 2023.10.17
[Java] Optional이란? Optional 개념 및 사용  (0) 2023.10.05
[Java] import static 사용하는 이유  (0) 2023.08.09
Intellij tomcat 연동 및 설정 (gradle)  (0) 2023.05.19

+ Recent posts