[Spring Boot] IntelliJ로 Spring Boot 시작하기

[Spring Boot] IntelliJ로 Spring Boot 시작하기

인텔리제이 설치하기

설치페이지에서 IntelliJ 유료버전인 Ultimate와 무료버전인 Community 두 가지 버전 중 선택하여 설치한다.
유료버전은 학생 인증을 통하여 무료로 사용할 수 있다. 다음글을 참고하자


인텔리제이에서 프로젝트 생성하기

New Project 버튼을 클릭한다.

프로젝트 유형은 Gradle을 선택한다.
이름과 디렉토리 위치를 지정하고 GroupId와 ArtifactId를 설정한다. ArtifactId는 프로젝트 이름이 된다.

Spring Boot 버전을 선택한다.
초기에 프로젝트를 생성한 후 셋팅하고 싶은 의존성(Dependencies)을 선택한다.

Spring Boot DevTools, Spring Web, Mustache

Finish를 선택하면, 아래와 같이 프로젝트가 생성된다.


스프링 부트 프로젝트 설명

plugins에서 io.spring.dependency-management 플러그인은 스프링 부트의 의존성들을 관리해 주는 플러그인이다.

repositories는 각종 의존성 들을 어떤 원격저장소에서 받을지 정한다. 기본적으로 mavenCentral을 많이 사용하지만, 최근에는 라이브러리 업로드 난이도 때문에 jcenter도 많이 사용한다.

  • mavenCentral은 이전부터 많이 사용하는 저장소지만, 본인이 만든 라이브러리를 업로드하기 위해서 많은 과정과 설정이 필요하기 때문에 개발자들이 직접 만든 라이브러리의 공유가 점점 안 되는 상황이 발생했다.
  • 최근에 나온 jcenter는 이런 문제점을 개선하여 라이브러리 업로드를 간단하게 하였다. 또한, 여기서 한 걸음 더 나아가 jcenter에 라이브러리를 업로드하면 mavenCentral에도 업로드될 수 있도록 자동화를 할 수 있다. 그래서 개발자들의 라이브러리가 점점 jcenter로 이동하고 있다.

dependencies는 프로젝트 개발에 필요한 의존성들을 선언하는 곳이다.
아까 설정한 라이브러리가 선언되어있다.


스프링 부트 프로젝트 시작하기

프로젝트 폴더 내 src>main>java>com.***.*** 안에 가장 기본이 되는 .java파일이 있는데 이를 실행한다.

위와 같이 정상적으로 실행되었다면, 웹 브라우저에서 localhost:8080으로 접속한다.


참고

추후 작성 글…인텔리제이 학생인증, vscode로 실행하기, maven/gradle 차이점, live reload사용하기, mustache

2021년 6월 23일 수요일 IT뉴스

1. 中 비트코인 채굴장 폐쇄, 그래픽카드 가격 폭락

中 비트코인 채굴장 폐쇄, 그래픽카드 가격 폭락

중국 정부가 비트코인 채굴업체 90%를 폐쇄했다는 소식이 전해지면서 중국 내 그래픽 카드 거래가격이 폭락했다고 사우스차이나모닝포스트가 21일 보도했다. 중국 정부의 암호화폐 단속 조치는 주요 채굴 장비 중 하나인 그래픽 카드 거래 가격에도 영향을 미쳤고, 보도에 따르면 엔비디아 쿼드로 P1000 모델은 이날 JD닷컴 스토어에서 2천429위안(약 42만5천원)에 거래됐다. 이 제품은 중국 정부가 비트코인 채굴 단속 의지를 밝히기 전인 5월초까지만 해도 3천위안(약 52만5천원)에 거래됐으며, 5월에 T몰에서 1만3천499위안(약 236만원)까지 치솟았던 에이수스 RTX 3060은 4천699위안(약 82만원)까지 폭락했다.


2. 4대 플랫폼 집중적으로 키우는 네이버… 글로벌시장 공략 본격화

4대 플랫폼 집중적으로 키우는 네이버… 글로벌시장 공략 본격화

네이버는 주력 서비스인 웹툰, 이커머스(전자상거래), 메타버스(가상현실), 클라우드 등 4대 플랫폼을 앞세워 해외 시장 공략을 본격화 하고 있으며, 특히 이들 4대 플랫폼 분야에서 얼마만큼 성과를 낼 수 있는지에 따라, 향후 카카오와의 시총 순위 경쟁에 영향을 미칠 전망이다.


3. 블록체인 핀테크 기업 글루와, 아프리카서 디지털 금융

블록체인 핀테크 기업 글루와, 아프리카서 디지털 금융

22일 실리콘밸리에 본사를 둔 토종 블록체인 핀테크 기업 글루와는 아프리카 현지 핀테크 업체 엘라와 손잡고 아프리카 금융소외자에게 공과금 납부, 송금, 소액대출 등 금융서비스를 제공한다고 밝혔다.

글루와는 낙후된 금융 인프라 때문에 신용기록이 없고, 이 때문에 대출이나 신용카드 서비스를 이용할 수 없던 아프리카 현지 사람들에게 대출이나 신용카드 결제 등 생활자금 목적의 소액 단기 금융 서비스를 제공하며, 대출 이후 서비스 이용자들의 신용기록을 블록체인망에 기록, 기존 금융회사들이 구축하지 못한 아프리카내 신용기록망을 구축하고, 금융 서비스를 확장해 나간다는 방침이다.

글루와 오태림 대표는 “아프리카 인구의 63% 이상이 24세 미만이고 이들 대부분 은행 문턱을 넘어본 적이 없는 금융소외자(Unbanked)들”이라며 “우리는 블록체인 기술과 글로벌 핀테크 노하우를 활용해 저개발 국가의 취약계층에게 금융서비스를 제공하고 불균형을 해소하는데 주력하고 있다”고 말했다.

[백준] 10798번 세로읽기

[백준] 10798번 세로읽기

출처: [백준] 10798번 세로읽기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 12502 6979 6023 57.758%

문제

아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.

이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.

1
2
3
4
5
A A B C D D
a f z z
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x

<그림 1>

한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.

심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.

그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:

Aa0aPAf985Bz1EhCz2W3D1gkD6x

칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.


입력

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.


출력

영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.


예제 입력 1

1
2
3
4
5
ABCDE
abcde
01234
FGHIJ
fghij

예제 출력 1

1
Aa0FfBb1GgCc2HhDd3IiEe4Jj

예제 입력 2

1
2
3
4
5
AABCDD
afzz
09121
a8EWg6
P5h3kx

예제 출력 2

1
Aa0aPAf985Bz1EhCz2W3D1gkD6x

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

input_string = [[0] * 15 for _ in range(5)]

for i in range(5):
temp = list(input().rstrip())
for j in range(len(temp)):
input_string[i][j] = temp[j]

for i in range(15):
for j in range(5):
if input_string[j][i] == 0:
continue
else:
print(input_string[j][i], end="")

소스코드

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

input = sys.stdin.readline

input_string = [list(input().rstrip()) for _ in range(5)]

for i in range(15):
for j in range(5):
if not input_string[j]:
continue
else:
print(input_string[j].pop(0), end="")

[백준] 1913번 달팽이

[백준] 1913번 달팽이

출처: [백준] 1913번 달팽이


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 6337 3430 2684 55.045%

문제

홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.

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

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.


입력

첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.


출력

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.


예제 입력 1

1
2
7
35

예제 출력 1

1
2
3
4
5
6
7
8
49 26 27 28 29 30 31
48 25 10 11 12 13 32
47 24 9 2 3 14 33
46 23 8 1 4 15 34
45 22 7 6 5 16 35
44 21 20 19 18 17 36
43 42 41 40 39 38 37
5 7

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

N = int(input())
M = int(input())

snail = [[0 for _ in range(N)] for _ in range(N)]

move = [(1, 0), (0, 1), (-1, 0), (0, -1)] # 하, 우, 상, 좌

cur_num = N ** 2
cur_x, cur_y = 0, 0
direction = 0
while cur_num > 0:
snail[cur_y][cur_x] = cur_num
ny, nx = move[direction]
dx = cur_x + nx
dy = cur_y + ny
if 0 > dx or dx >= N or 0 > dy or dy >= N or snail[dy][dx] != 0: # 갈 수 없는 곳만 (방문했던 곳X, 벽X)
direction = (direction + 1) % 4

ny, nx = move[direction]
cur_x += nx
cur_y += ny
cur_num -= 1

temp_x, temp_y = 0, 0
for i in range(N):
for j in range(N):
if snail[i][j] == M:
temp_x = j
temp_y = i
print(snail[i][j], end=" ")
print()
print(temp_y + 1, temp_x + 1)

[백준] 1138번 한 줄로 서기

[백준] 1138번 한 줄로 서기

출처: [백준] 1138번 한 줄로 서기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 6699 3604 3033 55.939%

문제

N명의 사람들은 매일 아침 한 줄로 선다. 이 사람들은 자리를 마음대로 서지 못하고 오민식의 지시대로 선다.

어느 날 사람들은 오민식이 사람들이 줄 서는 위치를 기록해 놓는다는 것을 알았다. 그리고 아침에 자기가 기록해 놓은 것과 사람들이 줄을 선 위치가 맞는지 확인한다.

사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.

각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.


출력

첫째 줄에 줄을 선 순서대로 키를 출력한다.


예제 입력 1

1
2
4
2 1 1 0

예제 출력 1

1
4 2 1 3

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

N = int(input())

memo = list(map(int, input().split()))
result = [0 for _ in range(N)]
for i in range(N):
cnt = 0
for j in range(N):
if memo[i] == cnt and result[j] == 0:
result[j] = i + 1
break
elif result[j] == 0:
cnt += 1

print(*result)

[백준] 17413번 단어 뒤집기 2

[백준] 17413번 단어 뒤집기 2

출처: [백준] 17413번 단어 뒤집기 2


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 512 MB 7264 3947 3069 55.317%

문제

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자(‘a‘-‘z‘), 숫자(‘0‘-‘9‘), 공백(‘ ‘), 특수 문자(‘<‘, ‘>‘)로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. <‘와 ‘>‘가 문자열에 있는 경우 번갈아가면서 등장하며, ‘<‘이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 ‘<‘로 시작해서 ‘>‘로 끝나는 길이가 3 이상인 부분 문자열이고, ‘<‘와 ‘>‘ 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.


입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.


출력

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.


예제 입력 1

1
baekjoon online judge

예제 출력 1

1
noojkeab enilno egduj

예제 입력 2

1
<open>tag<close>

예제 출력 2

1
<open>gat<close>

예제 입력 3

1
<ab cd>ef gh<ij kl>

예제 출력 3

1
<ab cd>fe hg<ij kl>

예제 입력 4

1
one1 two2 three3 4fourr 5five 6six

예제 출력 4

1
1eno 2owt 3eerht rruof4 evif5 xis6

예제 입력 5

1
<int><max>2147483647<long long><max>9223372036854775807

예제 출력 5

1
<int><max>7463847412<long long><max>7085774586302733229

예제 입력 6

1
<problem>17413<is hardest>problem ever<end>

예제 출력 6

1
<problem>31471<is hardest>melborp reve<end>

예제 입력 7

1
<   space   >space space space<    spa   c e>

예제 출력 7

1
<   space   >ecaps ecaps ecaps<    spa   c e>

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

input_string = list(input().rstrip())

temp_stack = []
result = []
flag = 0

for x in input_string:
if x == '<':
flag = 1
temp_stack.append(x)
elif x == '>':
flag = 0
temp_stack.append(x)
result += temp_stack
temp_stack = []
elif x == ' ':
temp_stack.append(x)
result += temp_stack
temp_stack = []
else:
if flag == 0:
temp_stack.insert(0, x)
elif flag:
temp_stack.append(x)

result += temp_stack

for x in result:
print(x, end='')

2021년 6월 21일 월요일 IT뉴스

1. ‘원하는 곳 어디에서나’ 라인, 하이브리드 워크 제도 공식화

‘원하는 곳 어디에서나’ 라인, 하이브리드 워크 제도 공식화 : 네이버 뉴스 (naver.com)

라인플러스가 오는 7월부터 ‘하이브리드 워크 1.0(LINE Hybrid Work 1.0)’ 제도를 공식 시행한다고 18일 알렸으며, 이로써 라인플러스의 공식 근무제도는 전일 완전재택부터 주 N회 재택까지 사무실근무와 재택근무를 조합해 선택할 수 있는 혼합형 근무제로서 라인 임직원은 코로나 종식 후에도 원하는 장소에서 원격으로 일할 수 있게 됐다.

라인은 어디에서나 동일한 업무 생산성을 유지할 수 있도록 그라운드룰을 발전시켜가고 있다. ▲원격근무지에 업무 집중 환경 조성 ▲업무 공유 및 피드백 활성화 ▲원활한 협업을 위한 근무시간 정립 및 공유 등 공통 룰에 더해 조직별 직무 특성, 프로젝트 진행 상황, 협업 체계 등 요소를 고려해 조직별 그라운드룰을 수립해왔다.


2. “페이스북이 스마트워치를?”…빅테크 왜 ‘웨어러블’ 뛰어드나

“페이스북이 스마트워치를?”…빅테크 왜 ‘웨어러블’ 뛰어드나 : 네이버 뉴스 (naver.com)

![갤럭시 워치3, 갤럭시 워치 액티브2사용자는삼성 헬스 모니터` 앱을 통해 언제 어디서든 본인의 혈압과 심전도를 측정, 기록할 수 있다. /사진=삼성전자](https://imgnews.pstatic.net/image/009/2021/06/12/0004808163_003_20210612200203500.jpeg?type=w647)

스마트워치는 스마트폰보다도 더 몸에 찰싹 달라붙어 있어, 24시간 내내 한 사람의 모든 일상의 데이터를 수집하며, 개인들의 헬스 데이터는 어떤 것보다 가장 양질의 데이터로 분류되기 때문에, 애플 독주의 시장에서 연합전선을 펼치는 삼성과 구글까지 빅테크들은 저마다 스마트워치 시장을 장악하려고 노력하고 있습니다.

한국보건산업진흥원에 따르면 디지털 헬스케어 시장 규모는 2019년 1063억달러(약 118조원)로 추산하며, 해마다 30%씩 성장하는 시장으로 2026년에는 6394억달러(약 711조원)로 전망되기 때문에 이 시장 파이를 조금이라도 가져가서 매출을 만들어낼 수 있다면 뛰어들지 않을 이유가 없다.

페이스북은 페이스북과 인스타그램 이용자만 전 세계에 32억명이므로 이 중에 일부라도 자사 워치를 이용하게 만들 수 있다면 시장에 뛰어드는 게 여러모로 페이스북에 이득이다.


3. 네이버와 카카오는 왜 SM엔터 지분확보 전쟁에 나섰나

네이버와 카카오는 왜 SM엔터 지분확보 전쟁에 나섰나 : 네이버 뉴스 (naver.com)

네이버와 카카오가 웹툰과 웹소설 IP를 최대한 확보하기 위해 관련 회사들에 줄줄이 지분 투자를 하거나 인수를 하는 것의 연장선상에 SM엔터에는 내로라하는 아이돌인 일본에서 꾸준히 엔화를 벌어오는 ‘동방신기’, 아시아를 호령하는 슈퍼주니어를 비롯해 샤이니, 엑소(EXO), 레드벨벳, NCT드림, 에스파(aespa) 등 코어 팬덤을 보유한 아티스트들은 그 자체로 지식재산권, 즉 스토리(IP)가 된다.

팬들은 이들 아티스트의 스토리텔링으로 만들어진 세계를 즐기고, 그 세계의 부산물인 라이선스 기반 상품을 줄줄이 소비하고, 단순히 음반을 사는 것 외에 이들로 만들어진 게임과 책, 굿즈 등을 차례로 구매하고 소장할 수 있는 것이다.

네이버와 카카오 같은 정보통신기술(ICT) 기업과 손잡고 더 구체화하려는 사업은 바로 메타버스를 이용한 ‘온라인 콘서트’ 사업입니다.

[백준] 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)