[Spring Boot] JPA 즉시 로딩과 지연 로딩(FetchType.EAGER or LAZY)

[Spring Boot] JPA 즉시 로딩과 지연 로딩(FetchType.EAGER or LAZY)

블로그 프로젝트 진행 중 FetchType.LAZY와 EAGER이란 것이 나왔다.

하나의 게시물을 눌렀을 때, 화면에 필수적으로 나타나야 하는 것은

  • 작성자
  • 제목
  • 내용

위 3가지가 있었고 있었고, 댓글은 바로 보여지는 경우와 접혀있다가 눌렀을 때 보이는 경우로 나눌 수 있었다.


JPA의 기본 패치 전략

- @ManyToOne, @OneToOne: 즉시로딩(FetchType.EAGER)

- @OneToMany, @ManyToMany : 지연로딩(FetchType.LAZY)

JPA의 기본 패치 전략으로 인해 ManyToOne은 EAGER, OneToMany는 LAZY로 되어있다.

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
public class Board {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
private int id;

@Column(nullable = false, length = 100)
private String title;

@Lob // 대용량 데이터
private String content; // 섬머노트 라이브러리 <html>태그가 섞여서 디자인이 됨.

@ColumnDefault("0")
private int count; // 조회수

@ManyToOne(fetch = FetchType.EAGER) // Many = Board, One = User ==> 한명의 유저는 여러개의 보드를 쓸 수 있다.
@JoinColumn(name = "userId")
private User user; // DB는 object를 저장할 수 없어서 Foreign key를 사용하지만, 자바는 오브젝트를 저장할 수 있다.

@OneToMany(mappedBy = "board", fetch = FetchType.LAZY) // 하나의 게시물은 여러개의 답변을 가질 수 있다.
// mappedBy 연관관계의 주인이 아니다. (FK가 아니다) DB에 컬럼 생성X
private List<Reply> reply;

@CreationTimestamp
private Timestamp createDate;
}


1. 댓글이 바로 보이는 경우

즉시로딩 fetch = FetchType.EAGER을 사용하면 된다.

2. 댓글을 접어놓았을 경우

지연로딩 fetch = FetchType.LAZY를 사용하면 된다.

나는 댓글을 바로 Load할 것이기 때문에 답변 부분의 OneToMany JPA의 기본패치 전략 LAZY즉시로딩 EAGER로 바꿔줄 것이다.

1
2
3
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER) // 하나의 게시물은 여러개의 답변을 가질 수 있다.
// mappedBy 연관관계의 주인이 아니다. (FK가 아니다) DB에 컬럼 생성X
private List<Reply> reply;
[Spring Boot] IntelliJ에서 Live Reload 설정하기

[Spring Boot] IntelliJ에서 Live Reload 설정하기

Live Reload

  • Live Reload라는 기능은 Spring Boot로 개발하면서 자바 소스를 수정하고 저장하면 자동으로 재시작을 해주는 기능이다.

1. spring-boot-devtools 의존성 추가하기

1
developmentOnly 'org.springframework.boot:spring-boot-devtools'

2. application.yml에 추가하기

1
2
3
4
5
6
7
8
9
spring:
devtools:
livereload: # view단이 바뀌었을 때 자동으로 리로드 설정
enabled: true
restart: # 컨트롤러,모델단(classpath에 있는 파일)이 바뀌었을 때 프로젝트 재시작 설정
enabled: false

freemarker:
cache: false

3. Intelli J 설정 수정하기

Settings > Build, Execution, Deployment > Compiler >Build project automatically 활성화

4. registry 수정하기

Find Action (Ctrl + Shift + A) –> “registry” 검색 –> compiler.automake.allow.when.app.running Value 체크

[백준] 2841번 외계인의 기타 연주

[백준] 2841번 외계인의 기타 연주

출처: [백준] 2841번 외계인의 기타 연주


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 5543 2390 1881 42.605%

문제

상근이의 상상의 친구 외계인은 손가락을 수십억개 가지고 있다. 어느 날 외계인은 기타가 치고 싶었고, 인터넷에서 간단한 멜로디를 검색했다. 이제 이 기타를 치려고 한다.

보통 기타는 1번 줄부터 6번 줄까지 총 6개의 줄이 있고, 각 줄은 P개의 프렛으로 나누어져 있다. 프렛의 번호도 1번부터 P번까지 나누어져 있다.

멜로디는 음의 연속이고, 각 음은 줄에서 해당하는 프렛을 누르고 줄을 튕기면 연주할 수 있다. 예를 들면, 4번 줄의 8번 프렛을 누르고 튕길 수 있다. 만약, 어떤 줄의 프렛을 여러 개 누르고 있다면, 가장 높은 프렛의 음이 발생한다.

예를 들어, 3번 줄의 5번 프렛을 이미 누르고 있다고 하자. 이때, 7번 프렛을 누른 음을 연주하려면, 5번 프렛을 누르는 손을 떼지 않고 다른 손가락으로 7번 프렛을 누르고 줄을 튕기면 된다. 여기서 2번 프렛의 음을 연주하려고 한다면, 5번과 7번을 누르던 손가락을 뗀 다음에 2번 프렛을 누르고 연주해야 한다.

이렇게 손가락으로 프렛을 한 번 누르거나 떼는 것을 손가락을 한 번 움직였다고 한다. 어떤 멜로디가 주어졌을 때, 손가락의 가장 적게 움직이는 회수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 멜로디에 포함되어 있는 음의 수 N과 한 줄에 있는 프렛의 수 P가 주어진다. (N ≤ 500,000, 2 ≤ P ≤ 300,000)

다음 N개 줄에는 멜로디의 한 음을 나타내는 두 정수가 주어진다. 첫 번째 정수는 줄의 번호이고 두 번째 정수는 그 줄에서 눌러야 하는 프렛의 번호이다. 입력으로 주어진 음의 순서대로 기타를 연주해야 한다.


출력

첫째 줄에 멜로디를 연주하는데 필요한 최소 손가락 움직임을 출력한다.


예제 입력 1

1
2
3
4
5
6
5 15
2 8
2 10
2 12
2 10
2 5

예제 출력 1

1
7

예제 입력 2

1
2
3
4
5
6
7
8
7 15
1 5
2 3
2 5
2 7
2 4
1 5
1 3

예제 출력 2

1
9

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

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

melody = [[] for _ in range(7)]
count = 0
for _ in range(N):
a, b = map(int, input().split())
if melody[a]:
if melody[a][-1] < b:
melody[a].append(b)
count += 1
elif melody[a][-1] > b:
while melody[a][-1] > b:
melody[a].pop()
count += 1
if not melody[a]:
break
if melody[a] and melody[a][-1] == b:
continue
else:
melody[a].append(b)
count += 1

elif melody[a][-1] == b:
continue

else:
melody[a].append(b)
count += 1

print(count)

[백준] 4889번 안정적인 문자열

[백준] 4889번 안정적인 문자열

출처: [백준] 4889번 안정적인 문자열


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 2235 1068 890 46.793%

문제

여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 여기서 안정적인 문자열을 만들기 위한 최소 연산의 수를 구하려고 한다. 안정적인 문자열의 정의란 다음과 같다.

1
2
3
4
5
1. 빈 문자열은 안정적이다.
2. S가 안정적이라면, {S}도 안정적인 문자열이다.
3. S와 T가 안정적이라면, ST(두 문자열의 연결)도 안정적이다.

{}, {}{}, {{}{}}는 안정적인 문자열이지만, }{, {{}{, {}{는 안정적인 문자열이 아니다.

문자열에 행할 수 있는 연산은 여는 괄호를 닫는 괄호로 바꾸거나, 닫는 괄호를 여는 괄호로 바꾸는 것 2가지이다.


입력

입력은 여러 개의 데이터 세트로 이루어져 있다. 각 데이터 세트는 한 줄로 이루어져 있다. 줄에는 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 문자열의 길이가 2000을 넘는 경우는 없고, 항상 길이는 짝수이다.

입력의 마지막 줄은 ‘-‘가 한 개 이상 주어진다.


출력

각 테스트 케이스에 대해서, 테스트 케이스 번호와 입력으로 주어진 문자열을 안정적으로 바꾸는데 필요한 최소 연산의 수를 출력한다.


예제 입력 1

1
2
3
4
}{
{}{}{}
{{{}
---

예제 출력 1

1
2
3
1. 2
2. 0
3. 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 math
import sys

input = sys.stdin.readline
i = 0
while True:
i += 1
input_string = list(input().rstrip())

if input_string[0] == '-':
break
else:
open_bracket = []
close_bracket = []
for x in input_string:
if x == '{':
open_bracket.append(x)
elif x == '}':
if open_bracket:
open_bracket.pop()
else:
close_bracket.append(x)

count = math.ceil(len(open_bracket) / 2) + math.ceil(len(close_bracket) / 2)
print(f"{i}. {count}")

2021년 07월 16일 금요일 IT뉴스

1. 구글코리아, ‘머신러닝 부트캠프’ 개최

구글코리아, ‘머신러닝 부트캠프’ 개최

[사진=구글]

머신러닝 부트캠프는 머신러닝 개발자 지망생들에게 교육과 취업 기회를 제공하고, 머신러닝 개발 인력 부족으로 어려움을 겪고 있는 국내 기업이 인력풀을 확보할 수 있도록 지원하는 프로그램이며, 지난해 진행한 프로그램에는 약 3천명의 개발자가 지원했으며 이중 코세라 딥러닝 특화과정을 수료한 150여명의 참가자는 머신러닝 자격증을 취득해 현재 다양한 산업군에서 머신러닝 개발자로 근무하고 있다.

올해 머신러닝 부트캠프에는 실습형 교육 과정이 새롭게 추가됐다. 참가자는 글로벌 인공지능 경진대회 플랫폼 캐글(Kaggle)의 과제 중 하나를 선택해 일정한 순위권에 오르는 것을 목표로 실습형 교육 과정을 경험, 프로젝트를 주도적으로 진행해 직접 성과를 내게 된다.


2. 개발자로 만족한다 39.2%···연봉 불만 1~3년차가 가장 높아

개발자로 만족한다 39.2%···연봉 불만 1~3년차가 가장 높아

디지털 전환(DX) 바람으로 소프트웨어(SW) 개발자 몸 값이 상한가지만 개발자로서 만족한다는 응답이 39.2%에 불과하다는 조사 결과가 나왔으며, 연봉에 불만이 가장 높은 개발자는 1~3년차인 것으로 나타났고 5년차 미만 개발자들은 근무 연차와 상관 없이 4000만원 이상 5000만원 미만 수준의 연봉을 희망 연봉 1순위로 답해, 개발자의 최소 희망 몸값은 4000만원 수준으로 점쳐졌다.

한편 개발자들은 자신의 연봉을 높이기 위해 교육, 프로젝트 준비, 스터디 모임 등 자기개발에 힘쓰고 있는 것으로 나타났다. 복수 의견으로 조사한 연차 별 연봉 인상을 위한 노력을 묻는 질문에 대다수 현업 활동 개발자는 토이 프로젝트를 1순위로 꼽았고, 단 10년차 이상 개발자는 동영상 강의로 프로젝트 준비를 갈음했으며 3년차 미만 개발자는 부족한 이론 지식을 습득하기 위한 스터디 모임에 중점을 둔 것으로 확인됐다.


3. 야놀자, 실탄 2兆 장전…제2의 쿠팡 대박 신화 시작됐다

야놀자, 실탄 2兆 장전…제2의 쿠팡 대박 신화 시작됐다

1조원에 달하는 자금을 유치할 것이라는 업계 소문보다 2배 가까운 ‘실탄’을 확보한 야놀자는 미국 나스닥 상장 추진과 함께 연간 3천조원 규모의 글로벌 여행·호스피탈리티 시장을 공략할 것으로 전망된다.

이미 해외에 호텔 등 객실관리 시스템을 구축한 야놀자는 국내에서 쌓은 경험을 글로벌 시장에 이식함으로써 글로벌 여가 플랫폼 입지를 더욱 튼튼히 다질 것으로 기대를 모은다. 한 사모펀드(PE)운용사 관계자는 이번 투자 유치를 두고, 야놀자가 일본·동남아 시장 공략을 위한 초석을 다진 것으로 전망했다.


4. 반려동물 통합 케어 플랫폼 ‘펫닥’, 100억 원 규모 시리즈C 투자 유치

반려동물 통합 케어 플랫폼 ‘펫닥’, 100억 원 규모 시리즈C 투자 유치

반려동물 통합 케어 플랫폼 서비스 ‘펫닥’이 100억 규모의 시리즈C 투자 유치를 했다. 펫닥은 이번 투자를 바탕으로 수의사들과 시너지 효과를 내고, 안전하고 신뢰할 수 있는 반려동물 식품과 헬스케어 서비스를 제공한다는 계획이다.


5. MZ세대 10명 중 9명, “핀테크로 간편결제 사용…만족도 높아”

5년전 美증시 입성한 라인의 ‘나비효과’…”카카오 안부럽다”

20・30 MZ세대들이 대표적인 핀테크 서비스인 간편결제(송금) 서비스를 이용하기 위해 카카오페이, 네이버페이, 토스 등 핀테크 플랫폼을 주로 사용하고, 핀테크 서비스를 이용하는 이유는 간단하고 편리한 절차 등 편의성이 가장 큰 것으로 나타났다.

전금법 개정안 통과로 달라질 금융 생활에 대해 2030세대는 대체로 긍정적인 의견을 밝혔고 특히 핀테크 플랫폼, 카드사 등에 계좌를 개설하고 급여를 이체받아 바로 결제 및 송금, 공과금 및 카드청구금 납부 등이 가능한 종합지급결제사업자 도입에 대해 긍정적인 의견이 84.6%에 달했다. 이 외 소액후불결제 도입, 선불충전금 한도 상향 등에 대해서도 절반 이상이 필요하거나 유용하다 등 긍정적 의견을 보였고, 고위험 거래에 대한 2개 이상의 인증 의무 등 보안강화에 대해서도 “지금보다 불편해져도 금융거래 안전을 위해 필요하다”는 의견이 62%에 달했다.

[백준] 15815번 천재 수학자 성필

[백준] 15815번 천재 수학자 성필

출처: [백준] 15815번 천재 수학자 성필


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 1133 399 343 37.692%

문제

평행 세계의 성필은 숫자와 연산자를 만든 당대 최고의 수학자이다. 그리고 놀랍게도 이 숫자와 연산자는 현재 우리가 사용하는 것과 같다. 하지만 수식은 연산자가 피연산자 가운데 위치하는 우리와는 다르게 연산자가 피연산자 뒤에 위치한다고 한다.

우리 세계의 식을 성필의 식으로 바꾸는 방법을 간단히 설명하자면 이렇다. 우선 주어진 식을 연산자의 우선순위에 따라 괄호로 묶어준다. 그런 다음에 괄호 안의 연산자를 괄호의 오른쪽으로 옮겨주면 된다.

예를 들어 a+bc는 (a+(bc))의 식과 같게 된다. 그다음에 안에 있는 괄호의 연산자 를 괄호 밖으로 꺼내게 되면 a+bc가 된다. 마지막으로 또 +를 괄호의 오른쪽으로 고치면 abc*+가 되게 된다.

천재 수학자 성필은 자신이 만든 이런 간단한 식조차 1초 안에 계산하지 못하는 사람들을 위하여 답을 구해주는 프로그램을 개발하려고 했지만 아쉽게도 성필의 세계에는 프로그래밍 언어가 없다. 프로그래밍을 할 수 있는 우리가 성필을 위해 평행세계의 식을 계산하는 프로그램을 만들어주자.


입력

길이가 100이 넘지 않는 수식이 예제 입력과 같이 공백 없이 입력된다. 수식은 0부터 9까지의 숫자와 연산자 ‘+’, ‘-‘, ‘*’, ‘/‘ 로만 이루어져 있다.

또한, 수식의 계산 중간 과정의 모든 결과는 항상 2,147,483,647을 넘지 않는 정수이고 0으로 나누는 경우는 없습니다.

잘못된 수식이 입력되는 경우도 없습니다.


출력

입력으로 주어진 성필의 수식의 답을 첫째 줄에 출력한다.


예제 입력 1

1
123*+

예제 출력 1

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

input = sys.stdin.readline

input_string = input().rstrip()

stack = []

for x in input_string:
if x.isdigit():
stack.append(int(x))
else:
num2, num1 = stack.pop(), stack.pop()
if x == '+':
stack.append(num1 + num2)
elif x == '-':
stack.append(num1 - num2)
elif x == '/':
stack.append(num1 // num2) # 정수형임으로 //
elif x == '*':
stack.append(num1 * num2)

print(stack[0])

[백준] 2257번 화학식량

[백준] 2257번 화학식량

출처: [백준] 2257번 화학식량


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 1931 617 474 35.268%

문제

우리가 널리 사용하는 H2O(물), CH3COOH(아세트산)과 같은 화학식은 알파벳과 숫자, 그리고 괄호로 구성된다. 먼저 알파벳은 원자를 나타내는 것으로 H는 수소(Hydrogen), C는 탄소(Carbon), O는 산소(Oxygen) 원자를 뜻한다. 또한 원자를 나타내는 알파벳 뒤에 따르는 숫자는 그 원자가 몇 개 포함되어 있는지를 뜻한다. 따라서 COOHHH 분자는 CO2H3로 나타낼 수 있다. 이 문제에서, 숫자는 항상 2 이상 9 이하로만 입력으로 주어진다. 따라서 CO23과 같이 숫자가 두자리인 경우는 없다.

물의 화학식을 보고 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어졌음을 알 수 있다. 또한 아세트산의 화학식처럼 한 종류의 알파벳이 화학식에 여러 번 나타날 수도 있다. 실제 화학식 또한 이렇게 사용되는데, 이는 분자의 결합 구조를 나타내기 위함이다.

종종 화학식에는 괄호가 사용되기도 하는데 괄호로 묶인 원자들은 하나의 새로운 원자와 같은 작용을 한다. 따라서 CH(CO2H)(CO2H)(CO2H) 분자는 CH(CO2H)3와 같이 나타낼 수 있다. 괄호 안에 아무런 알파벳도 없는 경우도 있을 수 있는데, 이런 경우는 괄호가 없는 경우와 마찬가지라고 생각하면 된다.

이러한 화학식을 보고 우리는 화학식량을 계산할 수 있는데, 화학식량이란 그 화학식에 포함되어 있는 모든 원자들의 질량의 합을 말한다. 수소 원자 하나의 질량은 1, 탄소 원자 하나의 질량은 12, 산소 원자 하나의 질량은 16이다. 물은 두 개의 수소 원자와 한 개의 산소 원자로 이루어져 있으므로 물의 화학식량은 18이다.

화학식이 주어졌을 때, 이 화학식의 화학식량을 계산하는 프로그램을 작성하시오. 화학식은 수소, 탄소, 산소만을 포함하고 있는 것만이 입력으로 주어진다.


입력

첫째 줄에 화학식이 주어진다. 화학식은 H, C, O, (, ), 2, 3, 4, 5, 6, 7, 8, 9만으로 이루어진 문자열이며, 그 길이는 100을 넘지 않는다.


출력

첫째 줄에 화학식량을 출력한다. 분자량이 10,000이 넘는 고분자는 입력으로 주어지지 않는다.


예제 입력 1

1
(H)2(O)

예제 출력 1

1
18

출처


알고리즘 분류


소스코드

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 sys

input = sys.stdin.readline

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

values = {'H': 1, 'C': 12, 'O': 16}
stack = []
tmp = 0
for x in input_string:
if x == '(':
stack.append(x)
elif x == ')':
tmp = 0
while stack[-1] != '(':
num = stack.pop()
tmp += num
stack.pop()
stack.append(tmp)
elif x.isdigit():
tmp = stack.pop()
stack.append(tmp * int(x))
else:
stack.append(values[x])

print(sum(stack))

[백준] 11899번 괄호 끼워넣기

[백준] 11899번 괄호 끼워넣기

출처: [백준] 11899번 괄호 끼워넣기


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 32 MB 864 586 498 69.071%

문제

심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.

1
(()(()))()()

그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.

1
(()    ((    )))()    ()

크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.

1
)))()

승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 “그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?”라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.

1
((()))()

그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.

승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.


입력

첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.


출력

첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.


예제 입력 1

1
)))()

예제 출력 1

1
3

예제 입력 2

1
)(()

예제 출력 2

1
2

예제 입력 3

1
))()((

예제 출력 3

1
4

예제 입력 4

1
)(()(()))

예제 출력 4

1
1

힌트

괄호열이란 여는 괄호 ‘(’와 닫는 괄호 ‘)’로만 구성된 문자열을 말합니다.

올바른 괄호열은 아래와 같이 정의할 수 있습니다.

  • “()”는 올바른 괄호열입니다.
  • A가 올바른 괄호열이라면 “(A)” 역시 올바른 괄호열입니다.
  • A와 B가 모두 올바른 괄호열이라면 “AB” 역시 올바른 괄호열입니다.

출처


알고리즘 분류


소스코드

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

input = sys.stdin.readline

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

left = []
right = []

for x in input_string:
if x == '(':
left.append(x)
elif x == ')':
if left:
left.pop()
else:
right.append(x)

print(len(left) + len(right))

[백준] 20001번 고무오리 디버깅

[백준] 20001번 고무오리 디버깅

출처: [백준] 20001번 고무오리 디버깅


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 512 MB 905 557 513 68.309%

문제

백준 문제 풀이에 힘들어하는 수진이를 위해 민우는 문제해결에 도움이 되는 고무오리를 준비했다. 민우가 준비한 고무오리는 신비한 능력이 존재하는데, 최근에 풀던 백준 문제를 해결해주는 능력이다. 신비한 고무오리와 함께 수진이의 백준 풀이를 도와주자!

고무오리의 사용법은 다음과 같다.

  • “고무오리 디버깅 시작” 이라고 외친다
  • 문제들을 풀기 시작한다
  • 고무오리를 받으면 최근 풀던 문제를 해결한다
  • “고무오리 디버깅 끝” 이라고 외치면 문제풀이를 종료한다.

하지만 고무오리에는 치명적인 문제가 있는데, 풀 문제가 없는데 사용한다면 고무오리는 체벌로 두 문제를 추가한다는 점이다.


입력

첫 번째 줄에 “고무오리 디버깅 시작”이라고 주어진다. 두 번째 줄부터 “고무오리” 또는 “문제”가 주어진다. 이는 “고무오리 디버깅 끝”이 주어질 때까지 반복한다. 최대 102줄이 입력으로 주어진다.


출력

고무오리 디버깅이 끝날 때, 주어진 문제를 수진이가 해결하였는지 여부에 따라 남은 문제 없이 모든 문제를 해결하였으면 “고무오리야 사랑해”을 출력하고 하나라도 문제가 남았다면 “힝구”를 출력하라.


예제 입력 1

1
2
3
4
5
6
7
8
고무오리 디버깅 시작
문제
고무오리
문제
문제
고무오리
고무오리
고무오리 디버깅 끝

예제 출력 1

1
고무오리야 사랑해

예제 입력 2

1
2
3
4
5
고무오리 디버깅 시작
고무오리
고무오리
고무오리
고무오리 디버깅 끝

예제 출력 2

1
고무오리야 사랑해

예제 입력 3

1
2
3
4
5
6
7
8
9
10
11
12
13
고무오리 디버깅 시작
문제
문제
고무오리
고무오리
고무오리
문제
고무오리
문제
고무오리
고무오리
고무오리
고무오리 디버깅 끝

예제 출력 3

1
고무오리야 사랑해

예제 입력 4

1
2
3
고무오리 디버깅 시작
고무오리
고무오리 디버깅 끝

예제 출력 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
26
import sys

input = sys.stdin.readline

start = input().rstrip()

question = []
while True:
input_string = input().rstrip()
if input_string == '고무오리 디버깅 끝':
break
else:
if input_string == '문제':
question.append(0)
elif input_string == '고무오리':
if question:
question.pop()
else:
question.append(0)
question.append(0)

if question:
print("힝구")
else:
print("고무오리야 사랑해")

2021년 07월 14일 수요일 IT뉴스

1. 20% 넘어선 국내 클라우드 이용률… 유료화·서비스 종료로 선택지는 줄어

20% 넘어선 국내 클라우드 이용률… 유료화·서비스 종료로 선택지는 줄어

이용자의 클라우드 서비스 비중(1순위 기준) [KISDI 보고서 캡처]

개인용 클라우드 이용률은 높아졌지만 이용할 수 있는 클라우드 선택지는 줄어드는 모습이다. 구글이 최근 클라우드 서비스 유료화를 시작했고, 경쟁에서 밀려난 이통3사 등은 ‘변화된 시장 환경’을 이유로 클라우드 서비스를 종료하고 있다. LG유플러스는 올해 12월 개인 클라우드인 ‘U+박스’를 종료하고, SK텔레콤도 오는 9월27일 개인용 클라우드 서비스인 ‘클라우드 베리’를 종료하기로 했으며, 앞서 KT는 지난해 개인 클라우드 서비스를 종료했고 삼성전자도 갤럭시 스마트폰 이용자에게 제공하던 삼성 클라우드 서비스를 최근 종료하고, 마이크로소프트 원드라이브로 데이터를 이전하도록 했다.


2. “카카오택시에 상대도 안돼?”…‘우티’의 굴욕

“카카오택시에 상대도 안돼?”…‘우티’의 굴욕

SK텔레콤의 모빌리티 기업 ‘T맵 모빌리티’와 우버가 함께 만든 택시 호출 플랫폼 ‘우티’가 고전하고 있는데 출범 초기 이용자가 증가하며 순항하는 듯 했으나, 한 달만에 30만 명이 줄어들며 주춤하는 모양새다.

택시 호출 중개 시장은 ‘모빌리티’ 경쟁의 최전선이다. 대중화된 택시 호출 서비스에서 충분한 이용객을 확보해야 향후 대리 운전, 렌트카, 차량 공유, 전동 킥보드 등 개인형 이동수단(PM) 등 이동·운송 서비스 확장이 용이하기 때문이다.


3. 새 주인 찾는 인터파크, 누가 탐낼까?

새 주인 찾는 인터파크, 누가 탐낼까?

국내 1세대 이커머스 플랫폼인 인터파크가 매물로 나오면서 인수 후보에 관심이 쏠리고 있다. 시장에서는 항공과 티켓 판매 서비스를 제공 중인 네이버와 카카오도 인수 후보로 거론되고 있고 NHN티켓링크를 자회사로 두고 있는 NHN 또한 인터파크를 인수해 업계 1위로 올라설 수 있는 기회가 될 수 있다. NHN 자회사인 여행박사와 시너지를 낼 수 있는 기회이기도 하다.


4. 도쿄올림픽, 모바일은 어디서?…네이버·카카오 등 중계권 협상

도쿄올림픽, 모바일은 어디서?…네이버·카카오 등 중계권 협상

14일 업계에 따르면 네이버, 카카오, 웨이브, 아프리카TV, KT 시즌(Seezn) 등이 현재 지상파 3사와 도쿄올림픽 온라인 중계권 협상을 진행 중인 것으로 알려졌으며, 최근까지 쿠팡의 단독 중계권을 거의 확보한 듯한 형국이었으나, 협상 내용이 밝혀진 뒤 ‘보편적 시청권’ 논란이 일면서 쿠팡이 철회 의사를 밝힌 것으로 알려졌다.

하지만 코로나19 확산과 스타선수의 부재 등으로 도쿄올림픽에 대한 국민적 관심이 예년 같지 않아, 쿠팡이 올려놓은 중계권료를 지출하는 데 큰 부담을 느끼고 있는 것으로 전해졌다.


5. 5년전 美증시 입성한 라인의 ‘나비효과’…”카카오 안부럽다”

5년전 美증시 입성한 라인의 ‘나비효과’…”카카오 안부럽다”

5년 전 상장 당시 이해진 창업자(현 글로벌투자책임자)는 “라인이 이제는 도쿄와 뉴욕에 상장되며 글로벌 브랜드의 힘을 갖게 된 것이 너무 기쁘다”며 “조금 더 공격적으로 할 수 있는 자금이 확보되고, 성장할 수 있는 계기 마련됐다. 기술 쪽에 가장 많이 투자할 것”이라고 말하기도 했다.

이같은 네이버의 행보가 쿠팡의 뉴욕 상장 등 여타 IT 기업의 글로벌 진출에 긍정적 영향을 줬다는 분석도 나온다. 국내 스타트업 하이퍼커넥트 ‘아자르’가 중동에서 큰 성공을 거둔뒤, ‘틴더’를 운영하는 매치그룹에 약 2조원에 매각되는 등 국내에서의 성공만이 답이 아니라는 점을 알려줬다는 것이다.