[백준] 2331번 반복수열

[백준] 2331번 반복수열

출처: [백준] 2331번 반복수열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 256 MB 9795 4407 3250 44.176%

문제

다음과 같이 정의된 수열이 있다.

  • D[1] = A
  • D[n] = D[n-1]의 각 자리의 숫자를 P번 곱한 수들의 합

예를 들어 A=57, P=2일 때, 수열 D는 {57, 74(=5^2+7^2=25+49), 65, 61, 37, 58, 89, 145, 42, 20, 4, 16, 37, …}이 된다. 그 뒤에는 앞서 나온 수들(57부터가 아니라 58부터)이 반복된다.

이와 같은 수열을 계속 구하다 보면 언젠가 이와 같은 반복수열이 된다. 이때, 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 구하는 프로그램을 작성하시오. 위의 예에서는 {57, 74, 65, 61}의 네 개의 수가 남게 된다.


입력

첫째 줄에 A(1 ≤ A ≤ 9999), P(1 ≤ P ≤ 5)가 주어진다.


출력

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.


예제 입력 1

1
57 2

예제 출력 1

1
4

출처

-


알고리즘 분류


소스코드1

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 sys

input = sys.stdin.readline

A, P = map(int, input().split())

stack = [A]
temp = 0
while 1:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P

if temp in stack:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P
break
else:
stack.append(temp)

print(stack.index(temp))

소스코드2

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
import sys

input = sys.stdin.readline

A, P = map(int, input().split())

stack = [A]
removed_stack = []

while stack:
value = str(stack[-1])
temp = 0
for i in range(len(value)):
temp += int(value[i]) ** P

if temp not in stack:
stack.append(temp)
else:
stack.append(temp)
if temp in removed_stack:
break
else:
removed_stack.append(temp)

print(len(set(stack) - set(removed_stack)))

[백준] 1051번 숫자 정사각형

[백준] 1051번 숫자 정사각형

출처: [백준] 1051번 숫자 정사각형


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 10235 3747 3173 37.528%

문제

N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.


입력

첫째 줄에 N과 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 수가 주어진다.


출력

첫째 줄에 정답 정사각형의 크기를 출력한다.


예제 입력 1

1
2
3
4
3 5
42101
22100
22101

예제 출력 1

1
9

출처

  • 빠진 조건을 찾은 사람: adh0463
  • 문제를 번역한 사람: baekjoon
  • 문제의 오타를 찾은 사람: jh05013

알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys

input = sys.stdin.readline

N, M = map(int, input().split())
rectangle = [list(map(int, input().rstrip())) for _ in range(N)]

max_edge = min(N, M)
result = 0
for i in range(N):
for j in range(M):
for k in range(max_edge):
if i + k < N and j + k < M:
if rectangle[i][j] == rectangle[i][j + k] == rectangle[i + k][j] == rectangle[i + k][j + k]:
result = max(result, (k + 1) ** 2)
print(result)

[백준] 3085번 사탕게임

[백준] 3085번 사탕게임

출처: [백준] 3085번 사탕게임


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 17749 5491 3869 30.534%

문제

상근이는 어렸을 적에 “봄보니 (Bomboni)” 게임을 즐겨했다.

가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.

사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 보드의 크기 N이 주어진다. (3 ≤ N ≤ 50)

다음 N개 줄에는 보드에 채워져 있는 사탕의 색상이 주어진다. 빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y로 주어진다.

사탕의 색이 다른 인접한 두 칸이 존재하는 입력만 주어진다.


출력

첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.


예제 입력 1

1
2
3
4
3
CCP
CCP
PPC

예제 출력 1

1
3

예제 입력 2

1
2
3
4
5
4
PPPP
CYZY
CCPY
PPCC

예제 출력 2

1
4

예제 입력 3

1
2
3
4
5
6
5
YCPZY
CYZZP
CCPPP
YCYZC
CPPZZ

예제 출력 3

1
4

힌트

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.


출처


알고리즘 분류


소스코드

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
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys

input = sys.stdin.readline


def check(arr):
n = len(board)
answer = 1
for i in range(n):
cnt = 1
for j in range(1, n): # 열 순회하면서 연속 숫자 세기
if arr[i][j] == arr[i][j - 1]: # 이전것과 같으면 cnt+1
cnt += 1
else: # 이전 것과 다르면 cnt=1 초기화
cnt = 1
if cnt > answer:
answer = cnt

cnt = 1
for j in range(1, n): # 행 순회하면서 연속 숫자 세기
if arr[j][i] == arr[j - 1][i]: # 이전것과 같으면 cnt+1
cnt += 1
else: # 이전 것과 다르면 cnt=1 초기화
cnt = 1
if cnt > answer:
answer = cnt

return answer


N = int(input())
board = [list(input().rstrip()) for _ in range(N)]
result = 0

for i in range(N):
for j in range(N):
if j + 1 < N: # 열 체크
board[i][j], board[i][j + 1] = board[i][j + 1], board[i][j] # 인접 교환
temp = check(board)
if temp > result:
result = temp
board[i][j], board[i][j + 1] = board[i][j + 1], board[i][j] # 원복

if i + 1 < N: # 행 체크
board[i][j], board[i + 1][j] = board[i + 1][j], board[i][j] # 인접 교환
temp = check(board)
if temp > result:
result = temp
board[i][j], board[i + 1][j] = board[i + 1][j], board[i][j] # 원복

print(result)

[백준] 2693번 N번째 큰 수

[백준] 2693번 N번째 큰 수

출처: [백준] 2693번 N번째 큰 수


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 32 MB 3791 3044 2767 81.502%

문제

배열 A가 주어졌을 때, N번째 큰 값을 출력하는 프로그램을 작성하시오.

배열 A의 크기는 항상 10이고, 자연수만 가지고 있다. N은 항상 3이다.


입력

첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 배열 A의 원소 10개가 공백으로 구분되어 주어진다. 이 원소는 1보다 크거나 같고, 1,000보다 작거나 같은 자연수이다.


출력

각 테스트 케이스에 대해 한 줄에 하나씩 배열 A에서 3번째 큰 값을 출력한다.


예제 입력 1

1
2
3
4
5
4
1 2 3 4 5 6 7 8 9 1000
338 304 619 95 343 496 489 116 98 127
931 240 986 894 826 640 965 833 136 138
940 955 364 188 133 254 501 122 768 408

예제 출력 1

1
2
3
4
8
489
931
768

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
import sys

input = sys.stdin.readline

T = int(input())

for _ in range(T):
arr = list(map(int, input().split()))
arr.sort(reverse=True)
print(arr[2])

[백준] 10973번 이전 순열

[백준] 10973번 이전 순열

출처: [백준] 10973번 이전 순열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 7635 4771 3960 64.780%

문제

1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 바로 이전에 오는 순열을 구하는 프로그램을 작성하시오.

사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.

N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.

  • 1, 2, 3
  • 1, 3, 2
  • 2, 1, 3
  • 2, 3, 1
  • 3, 1, 2
  • 3, 2, 1

입력

첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.


출력

첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다.


예제 입력 1

1
2
4
1 2 3 4

예제 출력 1

1
-1

예제 입력 2

1
2
5
5 4 3 2 1

예제 출력 2

1
5 4 3 1 2

출처


알고리즘 분류


소스코드

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
40
41
42
43
44
45
46
47
48
import sys

input = sys.stdin.readline

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


i, j, k = [len(compare_list) - 1 for _ in range(3)] # 맨 뒤부터...
while i > 0 and compare_list[i - 1] <= compare_list[i]: # 맨 뒤부터 내림차순... 즉 오름차순일 경우
i -= 1

if not i: # 이전 순열이 없을 경우
print(-1)
exit(0)

while compare_list[i - 1] <= compare_list[j]:
j -= 1
compare_list[i - 1], compare_list[j] = compare_list[j], compare_list[i - 1]

while i < k:
compare_list[i], compare_list[k] = compare_list[k], compare_list[i]
i += 1
k -= 1

print(*compare_list)



------------메모리초과
import sys
from itertools import permutations

input = sys.stdin.readline

N = int(input())
compare_list = list(map(int, input().split()))
num_list = [i for i in range(1, N + 1)]

perm_list = list(permutations(num_list))
for i in range(len(perm_list)):
if list(perm_list[i]) == compare_list:
if i==0:
print(-1)
else:
for num in perm_list[i-1]:
print(num, end=" ")

[백준] 10972번 다음 순열

[백준] 10972번 다음 순열

출처: [백준] 10972번 다음 순열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 17068 7204 5176 43.001%

문제

1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 다음에 오는 순열을 구하는 프로그램을 작성하시오.

사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.

N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.

  • 1, 2, 3
  • 1, 3, 2
  • 2, 1, 3
  • 2, 3, 1
  • 3, 1, 2
  • 3, 2, 1

입력

첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.


출력

첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.


예제 입력 1

1
2
4
1 2 3 4

예제 출력 1

1
1 2 4 3

예제 입력 2

1
2
5
5 4 3 2 1

예제 출력 2

1
-1

출처


알고리즘 분류


소스코드

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
import sys

input = sys.stdin.readline

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


i, j, k = [len(compare_list) - 1 for _ in range(3)] # 맨 뒤부터...
while i > 0 and compare_list[i - 1] >= compare_list[i]: # 맨 뒤부터 오름차순... 즉 내림차순일 경우
i -= 1

if not i: # 다음 순열이 없을 경우
print(-1)
exit(0)

while compare_list[i - 1] >= compare_list[j]:
j -= 1
compare_list[i - 1], compare_list[j] = compare_list[j], compare_list[i - 1]

while i < k:
compare_list[i], compare_list[k] = compare_list[k], compare_list[i]
i += 1
k -= 1

print(*compare_list)

2021년 6월 18일 금요일 IT뉴스

1. 핀테크에서 붙은 네이버 vs 카카오

핀테크에서 붙은 네이버 vs 카카오

네이버, 카카오의 금융사업 현황. 출처=한겨레신문 제작

네이버와 카카오는 빅테크 기업의 금융 진출이라는 점에서 같지만, 접근 방식에서는 확연한 차이가 나타나는데, 네이버는 기존 금융사들과 제휴하거나 혁신금융으로 지정받는 방식으로 서비스를 넓혀가지만, 카카오는 영업 허가를 받아 직접 뛰어들어 시장을 흔드는 전략을 쓴다.

카카오는 금융 자회사로 카카오페이(송금·결제 등)와 카카오뱅크(은행)를 뒀고, 카카오페이의 자회사로 카카오페이증권, 지난 9일 보험업 예비허가를 받은 카카오손해보험이 있으며, 카카오페이와 카카오뱅크는 자본 확충을 위해 기업공개(IPO)를 추진 중이다. 카카오는 플랫폼을 통해 기존의 금융서비스를 중개·제공하는 역할로는 금융혁신에 한계가 있다고 설명한다.

네이버의 금융 자회사인 네이버파이낸셜은 금융위원회의 규제 샌드박스(규제 유예)에 선정돼, 스마트스토어 사업자를 대상으로 한 신용대출을 하고 있으며, 네이버파이낸셜이 자사 데이터를 바탕으로 신용평가를 하면 미래에셋캐피탈이 대출을 내어주는 식으로 운영된다. 네이버는 검색엔진에서 출발했기 때문에 자사 플랫폼 안에 방대한 데이터를 수집하고 이를 분석하는 기술이 강하고 카카오처럼 여러 계열사를 두지 않는 것은 네이버파이낸셜을 통해 데이터를 한곳에 집적해 서비스를 고도화하려는 취지로 볼 수 있으며, 은행 등 사업에 직접 뛰어들지 않고 기존 금융사와 제휴하는 방식을 쓰는 것은 ‘금융기업’보다는 ‘금융플랫폼 기업’으로서 사업 역량을 강화하려는 전략적 판단이라고 네이버는 설명한다.


2. 구글 워크스페이스, 일반 사용자에게 개방… 새 협업 환경 ‘스페이스’도 도입

구글 워크스페이스, 일반 사용자에게 개방… 새 협업 환경 ‘스페이스’도 도입

스페이스 스냅샷. 구글 워크스페이스 룸이 스페이스로 바뀐다. ⓒ Google

지난 10월 구글은 구글 G 스위트(G Suite)의 이름을 워크스페이스로 변경하고, 앱을 가로지르는 협업 환경을 만들 것이라고 밝힌 바 있으며, 구글은 우선 유료 요금제에 해당하는 서비스부터 변경 작업을 시작했고, 이제 일반 사용자 대상의 작업이 시작된 것이다.

구글은 또한, 계약직 근로자를 위한 개인용 비즈니스 워크스페이스 계정을 발표했는데, 구글에 따르면 이 새로운 계정에는 지능형 예약 서비스, 전문적 영상회의, 개인화된 이메일 마케팅을 비롯한 여러 프리미엄 기능이 제공된다.

  • 구글 채팅과 지메일 안의 구글 채팅은 다르다. 지원 문서에는 이렇게 명시되어 있다. “채팅과 지메일 안의 채팅에서 같은 기능을 이용할 수 있지만, 지메일에 통합된 것은 친구, 가족, 동료와 이메일 사이사이에 커뮤니케이션할 수 있는 중앙화 된 공간을 제공한다.”

3. KT, 핀테크 1위 웹케시에 236억 지분 투자

뱅크샐러드 이은 두 번째 행보…B2C•B2B 금융 플랫폼 사업 기반 확보

KT, 핀테크 1위 웹케시에 236억 지분 투자

KT(대표 구현모)는 광화문 이스트 사옥에서 웹케시 그룹에 속한 웹케시, 비즈플레이, 로움아이티 등 3개사를 대상으로 총 236억의 전략적 지분투자와 함께 금융 사업 협력 계약을 체결했다고 17일 밝혔다.

웹케시 그룹은 기업 고객의 사업 규모에 따라 ▲비즈플레이(대‧중견기업) ▲경리나라(중소기업) ▲세모장부(소상공인) 등 B2B 핀테크 솔루션을 제공하고 있으며 KT의 인공지능(AI), 빅데이터, 클라우드 등 플랫폼 기술력과 유무선 인프라와 웹케시 그룹이 보유하고 있는 기업 핀테크 서비스를 연계해 기업 규모와 업종 등 타깃별 신규 플랫폼 서비스를 선보이고 솔루션을 고도화한다는 계획이다.


4. SK하이닉스, 리더 ‘책임 강화’·직원 ‘처우 개선’…체질 개선 고삐

SK하이닉스, 리더 ‘책임 강화’·직원 ‘처우 개선’…체질 개선 고삐 : 네이버 뉴스 (naver.com)

구성원의 처우는 개선하고 최고경영자(CEO)에는 사업 성과에 대한 책임을 강화하는 등 선제적인 내부 자정 노력을 통해 조직문화를 새로 정비하고, 더 나아가 인재 확보 경쟁력을 끌어올리겠다는 전략이다.

◆ SK하이닉스, ‘박정호·이석희’ 경영 능력도 평가한다

◆ 구성원은 ‘처우 개선’…8000만 원 받는 대졸 신입 나온다

최근 SK하이닉스 노사는 임금협상을 진행하고, 기술 사무직, 생산직 등 전체 직군의 기본급을 기존 대비 8.07% 인상하기로 합의했다. 대졸 초임 연봉은 기존 4000만 원대에서 5040만 원으로 인상하여 기본급, PS(초과이익분배금), PI(생산성 격려금) 등을 합산한 SK하이닉스 신입사원 연봉은 최대 8000만 원 수준으로 점쳐진다. SK하이닉스는 현재 연 1회의 PS, 연 2회의 PI를 지급하고 있다.


5. “구글, 무료라더니…” 클라우드 유료화에 열받은 대학들

“구글, 무료라더니…” 클라우드 유료화에 열받은 대학들 : 네이버 뉴스 (naver.com)

구글은 지난 2019년 초부터 국내 대학들을 대상으로 이메일 저장 서비스를 무료로 제공하기 시작했고, 당시 구글은 각 대학에 “무제한 메일함 용량과 구글 포토·구글 드라이브 등 클라우드(가상 서버)를 무료로 사용할 수 있게 하겠다”고 홍보하며 가입을 유도하여 서버 운영에 매년 수억~수십억 원을 써야 했던 많은 대학은 자체 운영 서버를 중단하고 구글 서비스를 도입하고 이전까지 다른 클라우드 서비스를 이용하던 대학 교수·학생들도 일제히 구글 서비스에 가입했고, 개인 이메일은 물론이고 연구·교육 데이터도 구글 서버에 올려 보관했다.

하지만 구글이 2년 만에 무료 저장 정책을 뒤집으면서 대학들엔 비상이 걸렸다. 구글은 이달 초 서울대를 비롯한 각 대학에 ‘그동안 무제한으로 제공하던 스토리지(저장) 서비스를 내년 7월부터 기본 제공 용량을 100테라바이트로 제한한다’고 공지했고, 대학이 기본 제공 용량 이상의 저장 공간을 사용하려면 앞으로 별도의 요금을 구글에 내야 한다.

그래픽=양인성

[백준] 1292번 쉽게 푸는 문제

[백준] 1292번 쉽게 푸는 문제

출처: [백준] 1292번 쉽게 푸는 문제


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 10628 5891 5197 57.559%

문제

동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다.

이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다.

하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자.


입력

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.


출력

첫 줄에 구간에 속하는 숫자의 합을 출력한다.


예제 입력 1

1
3 7

예제 출력 1

1
15

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys

input = sys.stdin.readline

A, B = map(int, input().split())

cur_value = 1
position = 1
result = 0

for i in range(A, B + 1):
while position < i:
cur_value += 1
position += cur_value
result += cur_value

print(result)

[백준] 1748번 수 이어 쓰기 1

[백준] 1748번 수 이어 쓰기 1

출처: [백준] 1748번 수 이어 쓰기 1


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
0.15 초 128 MB 12262 5639 4743 51.209%

문제

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.

1234567891011121314151617181920212223…

이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.


출력

첫째 줄에 새로운 수의 자릿수를 출력한다.


예제 입력 1

1
5

예제 출력 1

1
5

예제 입력 2

1
15

예제 출력 2

1
21

예제 입력 3

1
120

예제 출력 3

1
252

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
N = input()
exp = 0
result = 0
while exp < len(N) - 1:
result += 9 * (10 ** exp) * (exp + 1)
exp += 1
result += (int(N) - (10 ** (len(N) - 1)) + 1) * len(N)
print(result)


---------------
# 시간초과
N = int(input())
new_num = ""
for i in range(1, N + 1):
new_num += str(i)

print(len(new_num))

[AWS] Start Amazon EC2

[AWS] Start Amazon EC2

Select Instance(Amazon Linux2 AMI) With t2.micro

Configure Security group - Add types [SSH(22), HTTP(80)]

Instance Spec