0%

Baekjoon Online Judge - 2884

Code (Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
H, M = input().split()
hours = int(H)
minutes = int(M)
if minutes - 45 >= 0:
h = str(hours)
m = str(minutes - 45)
print(h + ' ' + m)
else:
if hours == 0:
h = str(23)
else:
h = str(hours - 1)
m = str(minutes + 60 - 45)
print(h + ' ' + m)

프로그래머스 - 연습 문제

Review

  • 숫자의 제곱근을 찾은 다음 정수인지 아닌지 판별해서 계산하면 되는 문제

Code (Python)

1
2
3
4
5
6
7
8
9
10
import math

def solution(n):
answer = math.sqrt(n)
if answer.is_integer():
answer = (int(answer) + 1)
return answer * answer
else:
return -1
return

프로그래머스 - 연습 문제

Review

  • sorted 함수로 어떻게 특정 기준으로 정렬하지
  • 아 람다를 사용하면 되는구나
  • 그런데 기준 인덱스가 같을 때는 왜 사전순으로는 정렬이 안 되지?
  • 아 사전순으로 한 번 정렬한 걸 다시 재정렬하면 되는구나 (멍청)

Code (Python)

1
2
def solution(strings, n):
return sorted(sorted(strings), key=lambda x: x[n])

프로그래머스 - 연습 문제

Review

  • 과거 자바스크립트로 풀었던 문제인데 기억 리셋된 상태에서 다시 풀었음.
  • 놀랍게도 동일한 의식의 흐름으로 풀었음. 그때나 지금이나 똑같은가 보다.
  • 이 문제는 그냥 짜라는 대로 짜면 된다.
  • 홀수번째 알파벳이 대문자일 경우가 있으니 소문자로 처리를 확실하게 하면 됨.

Code (Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(s):
count = 0
answer = ''
for i in s:
if i == ' ':
count = 0
answer += ' '
else:
count += 1
if count % 2 == 1:
answer += i.upper()
else:
answer += i.lower()
return answer

Code (Javascript)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function solution(s) {
let check = 0;
let newStr = [];
for (let i = 0; i < s.length; i++) {
if (s[i] === " ") {
check = 0;
} else {
check++;
}
if (check % 2 === 1) {
newStr.push(s[i].toUpperCase());
} else {
newStr.push(s[i].toLowerCase());
}
}
return newStr.join("");
}

프로그래머스 - 연습 문제

Review

  • 계속 시간초과 나오다 에라토스테네스의 체로 겨우 통과
  • 1차 시도: 1과 자기 자신으로 나누어지는 수만 카운트하자 -> 시간 초과
  • 2차 시도: 일단 2로 나눌 수 있는 수는 거르고 시작하자. 그리고 어차피 자기 자신/2 이상으로 나눌 수는 없으니까 최대한 반복 횟수 줄여보자 -> 시간 초과
  • 3차 시도: 질문하기 피드 보니 에라토스테네스의 체를 사용하라고 한다 -> 통과
  • 예전이랑 지금이랑 시간 제한이 달라진 것 같음.
  • python의 set()을 사용하면 더 짧고 간단하게 구현 가능하다.

Code (Python)

1
2
3
4
5
6
7
8
9
def solution(n):
sieve = [True] * (n + 1)
m = int(n ** 0.5)

for i in range(2, m + 1):
for j in range(i+i, n + 1, i):
sieve[j] = False

return len([i for i in range(2, n + 1) if sieve[i] == True])

Baekjoon Online Judge - 1003

Review

  • 9월에 몇 번 풀었다 실패한 문제다. 며칠 전까지 계속 틀려서 총 8번을 틀렸는데, 대부분이 시간 초과였다.
  • 예전에는 재귀로 풀어도 AC를 받은 것 같은데 지금은 안 되는 걸 보니 시간 제한이 바뀌었나 봄. 그래서 메모이제이션으로 풀었다.
  • 처음에는 그냥 단순하게 전역으로 zero, one 변수를 선언하고 0일 때, 1일 때 각각 zero, one 값을 증가하는 방식으로 풀었다. 당연 틀림 ㅋㅋ. 이렇게 하면 안 된다. 내가 문제 제대로 이해 못하기도 했고… 아무튼 여기서 삽질 진짜 많이 했다.
  • example
  • fibonacci(5)는 fibonacci(4) + fibonacci(3)의 값으로 구할 수 있다. fibonacci(4)의 0과 1의 개수는 각각 2 3, fibonacci(3)의 0과 1의 개수는 1 2다. 따라서 fibonacci(5)는 그 둘을 더한 3 5가 된다. 참고로 fibonacci(4) = 3, fibonacci(5) = 5이다.
  • 결과적으로 0의 개수는 fibonacci(n-1), 1의 개수는 fibonacci(n)일 때 구할 수 있다.

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
static int[] memo;

public static int fibonacci(int n) {
if (n == 0) {
memo[0] = 0;
return 0;
} else if (n == 1) {
memo[1] = 1;
return 1;
} else if(memo[n] != 0) {
return memo[n];
}else {
return memo[n] = fibonacci(n-1) + fibonacci(n-2);
}
}

public static void main(String args[]) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(in.readLine());
for(int i = 0; i < T; i++) {
int N = Integer.parseInt(in.readLine());
memo = new int[N + 1];

if(N == 0) {
System.out.println(1 + " " +0);
} else if(N == 1) {
System.out.println(0 + " " +1);
} else {
fibonacci(N);
System.out.println(fibonacci(N-1) + " " + fibonacci(N));
}
}
}
}

Baekjoon Online Judge - 10172

Review

  • 자바스크립트로 풀었던 문제.
  • 이스케이프 문자를 사용해야 된다. 멍멍.

Code (JAVASCRIPT)

1
console.log("|\\_/|\n|q p| /}\n( 0 )\"\"\"\\\n|\"^\"` |\n||_/=\\\\__|");

Baekjoon Online Judge - 2577

Review

  • a,b,c는 1000보다 작은 자연수이니 배열의 최대 크기는 10이 됨. 왜냐면 자릿수만큼 저장해야 되니…
  • 나머지로 숫자의 갯수를 셀 수 있고, 몫으로 자릿수를 구할 수 있음.

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Scanner;

public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
int result = a * b * c;

int[] number = new int[10];

while(result > 0) {
number[result%10]++;
result/=10;
}

for(int i = 0; i < number.length; i++) {
System.out.println(number[i]);
}

sc.close();
}

}

Baekjoon Online Judge - 2609

Review

  • 최대공약수(GCD) 구하기: A B 중 큰 수, 작은 수 판별한 다음 큰 수를 작은 수로 나누어 나머지를 구한다. 그리고 나눈 나머지가 0이면 작은 수가 최대공약수, 나머지가 0이 아니면 나누기를 반복하면 된다.
  • 최소공배수(LCM) 구하기: A * B / GCD

Code (JAVA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

public static int GCD(int a, int b) {
if(a % b == 0) {
return b;
} else {
return GCD(b, a % b);
}
}

public static void main(String args[]) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] line = bf.readLine().split(" ");
int A = Integer.parseInt(line[0]);
int B = Integer.parseInt(line[1]);

int gcd = A > B ? GCD(A, B) : GCD(B, A);
int lcm = A * B / gcd;
System.out.println(gcd);
System.out.println(lcm);
}

}