[프로그래머스] Lv2.주식가격

[프로그래머스] Lv2.주식가격

출처: [코딩테스트 연습 완주하지 못한 선수]


문제

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.


제한

  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

입출력

prices return
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

입출력 예 1

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
def solution(prices):
answer = []

for i in range(len(prices)):
count = 0
for j in range(i + 1, len(prices)):
count += 1
if prices[i] > prices[j]:
break
answer.append(count)

return answer
[백준] 2503번 숫자 야구

[백준] 2503번 숫자 야구

출처: [백준] 2503번 숫자 야구


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 9137 4152 3430 45.923%

문제

정보문화진흥원 정보 영재 동아리에서 동아리 활동을 하던 영수와 민혁이는 쉬는 시간을 틈타 숫자야구 게임을 하기로 했다.

  • 영수는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 마음속으로 생각한다. (예: 324)
  • 민혁이는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 영수에게 묻는다. (예: 123)
  • 민혁이가 말한 세 자리 수에 있는 숫자들 중 하나가 영수의 세 자리 수의 동일한 자리에 위치하면 스트라이크 한 번으로 센다. 숫자가 영수의 세 자리 수에 있긴 하나 다른 자리에 위치하면 볼 한 번으로 센다.

예) 영수가 324를 갖고 있으면

  • 429는 1 스트라이크 1 볼이다.
  • 241은 0 스트라이크 2 볼이다.
  • 924는 2 스트라이크 0 볼이다.
  • 영수는 민혁이가 말한 수가 몇 스트라이크 몇 볼인지를 답해준다.
  • 민혁이가 영수의 세 자리 수를 정확하게 맞추어 3 스트라이크가 되면 게임이 끝난다. 아니라면 민혁이는 새로운 수를 생각해 다시 영수에게 묻는다.

현재 민혁이와 영수는 게임을 하고 있는 도중에 있다. 민혁이가 영수에게 어떤 수들을 물어보았는지, 그리고 각각의 물음에 영수가 어떤 대답을 했는지가 입력으로 주어진다. 이 입력을 바탕으로 여러분은 영수가 생각하고 있을 가능성이 있는 수가 총 몇 개인지를 알아맞혀야 한다.

아래와 같은 경우를 생각해보자.

  • 민혁: 123
  • 영수: 1 스트라이크 1 볼.
  • 민혁: 356
  • 영수: 1 스트라이크 0 볼.
  • 민혁: 327
  • 영수: 2 스트라이크 0 볼.
  • 민혁: 489
  • 영수: 0 스트라이크 1 볼.

이때 가능한 답은 324와 328, 이렇게 두 가지이다.

영수는 동아리의 규율을 잘 따르는 착한 아이라 민혁이의 물음에 곧이곧대로 정직하게 답한다. 그러므로 영수의 답들에는 모순이 없다.

민혁이의 물음들과 각각의 물음에 대한 영수의 답이 입력으로 주어질 때 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트라이크 개수를 나타내는 정수와 볼의 개수를 나타내는 정수, 이렇게 총 세 개의 정수가 빈칸을 사이에 두고 주어진다.


출력

첫 줄에 영수가 생각하고 있을 가능성이 있는 답의 총 개수를 출력한다.


예제 입력 1

1
2
3
4
5
4
123 1 1
356 1 0
327 2 0
489 0 1

예제 출력 1

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
import sys
from itertools import permutations

input = sys.stdin.readline

num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
cases = list(permutations(num, 3))

N = int(input())
for _ in range(N):
ques, s_c, b_c = map(int, input().split())
ques = list(str(ques))

temp_cases = []
for i in range(len(cases)):
strike, ball = 0, 0
for j in range(3):
if cases[i][j] == int(ques[j]):
strike += 1
elif int(ques[j]) in cases[i]:
ball += 1
if s_c == strike and b_c == ball:
temp_cases.append(cases[i])

# 한 줄 끝나고, 맞은 케이스만 사용할 수 있도록
cases = temp_cases

print(len(cases))

[프로그래머스] [2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어

[프로그래머스] [2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어

출처: [2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어


문제

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → “one4seveneight”
  • 234567 → “23four5six7”
  • 10203 → “1zerotwozero3”

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

제한

  • 1 ≤ s의 길이 ≤ 50
  • s가 “zero” 또는 “0”으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력

s result
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 1

  • 문제 예시와 같습니다.

입출력 예 2

  • 문제 예시와 같습니다.

입출력 예 3

  • “three”는 3, “six”는 6, “seven”은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 4

  • s에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내

  • 정확성 테스트 : 10초

풀이

-


소스코드

1
2
3
4
5
6
7
8
9
def solution(s):
convert_table = {'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8,
'nine': 9}

answer = s
for word, num in convert_table.items():
answer = answer.replace(word, str(num))

return int(answer)
[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))