num1, num2 = map(int, input().split())
# 유클리드 호제법을 사용하여 최대공약수를 구함
def gcd(a, b):
remainder = a % b
while remainder > 0:
# a와 b의 값을 갱신
a = b
b = remainder
remainder = a % b
return b
print('1' * gcd(num1, num2))
state는 immutble(불변성)을 유지해야 하기 때문이다. state는 컴포넌트 렌더링에 영향을 주는 데이터를 갖고 있는 객체인데, 이것을 업데이트 하기 위해서는 setState,useState가 필요하다. 직접 state를 수정하면 리액트는 render 함수를 호출하지 않아서 렌더링이 일어나지 않고 setState를 호출하여 state를 변경하면 리액트 엔진이 render 함수를 이용해서 렌더링을 실행하기 때문
import sys
n = int(sys.stdin.readline())
alphabet_dict = {}
answer = 0
pocket = []
for _ in range(n):
alphabet = input()
pocket.append(alphabet)
for alphabet in pocket:
for i, char in enumerate(alphabet):
num = 10 ** (len(alphabet) - i - 1)
if char not in alphabet_dict:
alphabet_dict[char] = 0
alphabet_dict[char] += num
alphabet_list = [value for value in alphabet_dict.values() if value > 0]
sorted_list = sorted(alphabet_list, reverse=True)
for i, value in enumerate(sorted_list):
answer += value * (9 - i)
print(answer)
from collections import deque
import sys
input = sys.stdin.readline # 인풋 입력시간 줄이기
N,M = map(int,input().split())
arr = [list(input().rstrip()) for _ in range(N)]
q = deque([])
result = []
for j in range(N): # 지훈이부터 움직여야되니까 지훈이 위치부터 찾기
for i in range(M):
if arr[j][i] == 'J':
arr[j][i] = 1 # 지훈이는 턴수로 초기화
q.append([j,i])
for j in range(N):
for i in range(M):
if arr[j][i] == 'F':
q.append([j,i])
def bfs():
global result, flag
directy = [-1,1,0,0]
directx = [0,0,-1,1]
while q:
if result != []: # 지훈이가 탈출했다면 bfs 탈출
break
y,x = q.popleft()
for k in range(4):
dy = directy[k] + y
dx = directx[k] + x
if (dy < 0 or dy >= N or dx < 0 or dx >= M) and arr[y][x] != 'F': # 턴이 시작하기전 불이 아닌것이(지훈이) 밖으로 나간다면 result에 값을 넣어줌으로써 탈출여부 확인
result.append(arr[y][x])
break # 턴 시작전 탈출이 가능하다면 턴을 진행하지 않음
if dy < 0 or dy >= N or dx < 0 or dx >= M or arr[dy][dx] == '#': # 배열 밖으로 벗어나거나 벽에 가로막히면 가지 않음
continue
if arr[dy][dx] == '.' and arr[y][x] != 'F': # 지나갈수 있는 공간이면서 현재 위치가 불이 아니라면(지훈이) 도착위치에 턴 초기화
arr[dy][dx] = arr[y][x] + 1
q.append([dy,dx])
elif arr[dy][dx] == 'F' or arr[y][x] != 'F': # 현재 위치가 불이 아니면(지훈이) 갈 곳이 없으므로 패스하고, 가야할 위치가 지점이 불이라면 탐색하지않음(중복탐색방지)
continue
else: # 걸러지고 남은것들은 전부 불이 이동할 수 있는 위치뿐
arr[dy][dx] = 'F'
q.append([dy,dx])
bfs()
if result != []:
print(min(result)) # 탈출이 여러번 된 경우에 가장 빨리 탈출했던것을 출력
else:
print('IMPOSSIBLE')
놓쳤던 부분
- 불과 지훈이가 움직이는 턴을 하나로 봤어야했는데 같은턴에 가장자리에서 지훈이와 불이 만나게되더라도 지훈이가 먼저 움직여서 탈출로 출력했었다.
안녕하세요! 저희 팀은 취향, 키워드 기반 일기메이트 추천 서비스 버디어리를 소개해드리겠습니다.
많은 사람들이 일기를 쓰는것도 시간이고 굳이 필요성을 못느끼는 사람이 많다고 생각합니다
하지만 개발자들이 TIL을 통해 성장하듯이, 일기를 통해 오늘 있었던일을 정리하고 자기성찰을 통한 내적 성장을 할 수 있습니다.
박보영씨가 일기를 열심히 쓰는거로 굉장히 유명하다고 합니다.
다음은 실제로 박보영씨가 작성한 일기인데요.
"이런 상황에서 못하는것은 부끄러운 일이라고 생각했는데 그 일을 내가 저지르고 말았다.."
연기를 하다가 본인에게 굉장히 실망했었던 일이 있었는데 박보영씨는 이 일을 일기에 적음으로써 스트레스가 많이 풀렸다고 합니다
여러분 예전에 교환일기 다들 써보셨나요?
앞선 사례처럼 혼자서 일기를 쓰는것만으로도 스트레스가 풀릴 수도 있지만, 누군가 내 얘기를 들어주는 것만으로도 큰 힘이 나는 경우도 있고, 혹은 좋은일이 있었는데 자신과 성향이 비슷한 누군가와 공유하고 싶은 순간이 있습니다.
그런 분들을 위해 기획한게 저희 버디어리 입니다 !
2. 서비스 소개
완전 반응형
기본적으로 저희 버디어리는 완전 반응형으로 구현되어 있습니다
PC,패드,모바일 언제 어디에서나 저희 버디어리를 사용하실 수 있도록 어떠한 환경에서도 일관적인 디자인을 제공해드립니다
OAuth 로그인
저희는 그룹일기의 접근성을 위해 OAuth를 통한 카카오톡 회원가입과 로그인을 구현하였습니다
단순 OAuth가 아닌 시큐리티와 결합하여 표준화된 OAuth를 구현했습니다.
저희 서비스에 로그인하시게 되면 jwt 인증 필터를 통해 1차적으로 요청이 중간이 변조, 탈취되었는지 확인할 수 있습니다.
덕분에 안전하게 서비스 제공을 할 수 있으며 카카오톡 알람을 통한 그룹일기 초대 메세지를 보낼 수 있습니다.
메인 페이지
메인 페이지는 풀페이지로 섹션별로 구성되어있으며
여러 애니메이션을 통해 버디어리를 소개해드리고 있습니다.
실시간 알람
저희는 SSE를 통한 실시간 알람을 전송해드립니다.
1:1 채팅 요청을 받을 때, 본인이 속한 그룹에 새 글이 올라왔을 때 메세지가 전송됩니다
Web Socket은 양방향으로 데이터를 주고받을 수 있지만 SSE를 사용하게 되면 클라이언트는 데이터를 받기만 합니다.
SSE는 별도의 프로토콜을 사용하지 않고 HTTP 프로토콜만으로 사용할 수 있기 때문에 Web Socket 에 비해 훨씬 가볍기도 하고 저희 프로젝트 특성상 웹소켓보다 SSE를 사용하는게 더 적합하다고 판단해 SSE를 사용하게 되었습니다.
취향 기반 유저 추천
최초 회원가입시 진행했던 설문조사를 토대로 랜덤의 익명 유저와 자신과의 유사도를 비교하여 확인하실 수 있습니다
저희는 spring 서버와 fast api서버가 분리 되있는데 fastapi서버에선 최초 회원가입시 진행하는 설문조사의 답변을 기반으로 tf-idf 및 코사인 유사도 계산 과정을 거쳐 다른 유저와의 유사도를 보여줍니다.
키워드 기반 유저 추천
취향 기반 추천은 랜덤의 유저라면, 키워드 기반 유저 추천은 본인이 작성했던 일기를 기반으로 자신과 비슷한 키워드를 주제로 일기를 작성한 유저들을 추천하는 방식입니다.
일기 작성 시 soynlp를 활용해 키워드를 추출 후 단어의 빈도수와 비례한 키워드 점수 형태로 저장하여 마찬가지로 tf-idf 및 코사인 유사도 계산 과정을 거쳐 키워드가 비슷한 유저를 추천하게됩니다.
감정 분석
저희는 유저가 사용했던 일기의 감정분석을 제공해드리고 있습니다.
유저가 일기를 쓰게 되면 AI를 통해 감정을 분석해서 그 결과를 다이어리의 해당 날짜에 이모티콘 형태로 보여주게됩니다.
스티커
유저가 방을 만들거나 일기를 작성하게되면 포인트를 얻게 되는데 해당 포인트로 저희가 직접 제작한 스티커를 상점을 통해 구매하여 이용하실 수 있습니다.
그룹일기
카카오톡 초대를 통해 원하는 사람과 그룹일기를 만들 수 있습니다
그룹에 속한 인원을 볼 수 있고
해당 그룹에 올라온글에 반응과 댓글을 남길 수 있습니다.
또한 남의 다이어리에 스티커를 붙일 수 있습니다
일기 작성
유저는 텍스트와 사진을 첨부하여 일기를 작성할 수 있고 해당 일기를 원하는 그룹에 동시에 올릴 수 있습니다.
혹은 아무것도 선택하지 않고 개인일기에만 저장할 수 있습니다
일기 작성이 마무리 되고 나면 가지고 있는 스티커를 원하는 위치에 붙일 수 있습니다.
마이페이지
프로필 수정을 통해 프로필 이미지와 닉네임과 소개글을 수정할 수 있고 설문조사를 다시 할 수 있습니다
달력에 본인이 작성한 날짜에 감정 이모지와 본인이 일기에 자주 쓰는 키워드들은 크게, 많이 사용하지 않은 단어들은 작게 워드 클라우드를 제공해줍니다
또한 일기를 작성한 날짜의 이모티콘을 확인하여 그 날의 일기 디테일을 볼 수 있습니다.
3. 시스템 아키텍쳐
저희는 향후에 서비스 규모가 커진다고 가정하였을 때를 고려하여 어플리케이션 로드 밸런서를 사용하여 http 트래픽에 대해 로드 밸런싱을 하기 때문에 경로를 확인하고 해당 서버에 적절하게 트래픽을 분배 할 수 있었습니다.
요즘 정말 많은 2030 세대가 주식투자를 하고 있습니다. 2021년 설문에서는 성인 3명 중 2명이 주식투자를 한다는 결과가 나오기도 했습니다. 이렇게 많은 사람들이 리스크를 감수하면서 돈을 투자하는데,얼마나 전문적으로 투자를 하고 있을까요? 저희가 사전에 유저들을 상대로 한 설문에서, 63%의 응답자가 전혀 경제 경영 관련 전문적인 교육을 이수한 적이 없다고 답했습니다. 전문적인 교육을 받지 않았다면 어디에서 주로 지식을 습득할까요?설문결과에 따르면 온라인 커뮤니티와 주변 지인이 상위 2개 응답인 것을 확인하실 수 있습니다.이러한 출처들은 전문성이 있는 정보와 없는 정보를 판별하기가 매우 어렵기 때문에 투자자들에게 혼란을 더 야기하곤 합니다. 그런데, 친구들과 온라인 커뮤니티에서 주식 관련 지식을 습득하는 재미는 동일하게 가져가면서,더 전문적인 정보를 바탕으로 투자할 수 있다면 어떨까요? 투자의 진입장벽을 낮추면서! 쉽고 재미있고 투자자들에게 양질의 정보를 제공하는 투자 연습 사이트 그게 바로 저희 리턴즈입니다.
🤚 안녕하세요 ! 저희 팀은 움짤 공유, 탐색, 그리고 채팅 서비스인 Zzalu를 만들었습니다.
Zzalu의 유래는 Zzal + U 로 짤과 너와 잇다라는 뜻을 가지고 있습니다 !
짤로 소통하는 고독방,
매일 개설되는 제목학원,
마지막으로 프로필에 전시되는 본인의 짤BTI까지!
저희 서비스의 "제목학원"에 참여하여 드립력을 뽐내주세요!
그럼 저희 프로젝트 일상의 모든 순간을 짤로! Zzalu 를 소개하겠습니다
주제 선택 이유
여러분들과 실시간으로 소통하면서 자유롭게 놀 수 있는 그러한 공간을 만들고싶었습니다.
하지만 그저 ‘즐거움’으로 비롯된 것은 아닙니다.
비의 깡의 gif가 불러온 역주행 , 그리고 giphy가 무려 5000억에 페이스북에 인수되었다는 사실!
움짤은 그저 개인이 재미를 느낄 수 있을 뿐만 아니라 실제로 수익성도 있을 수 있는 서비스라는 점입니다.
움짤, 밈은 시장성과 수요는 넘치지만 아직 다른 서비스가 선점하지 않았다고 판단했고,
저희는 저희만의 차별성을 더하면 이 서비스가 앞으로 실제 프로덕트로도 충분히 발전 가능이 있다 생각하여 프로젝트를 진행해 보았습니다 :)
from collections import deque
N,M = map(int,input().split())
flag = "NO" # flag값 설정
arr = [list(map(int,input())) for _ in range(N)]
def bfs(j,i):
global flag
q = deque([(j,i)])
directY = [-1,1,0,0]
directX = [0,0,-1,1]
while q:
y,x = q.popleft()
for k in range(4):
dy = directY[k] + y
dx = directX[k] + x
if dy < 0 or dy >= N or dx < 0 or dx >= M: # 범위를 벗어난다면 continue
continue
if arr[dy][dx] == 0 and (dy == N-1): # bfs를 돌다 제일 아래 쪽(inner side)에 도착하게 되면 flag 값 변경
flag = "YES"
arr[dy][dx] = 1
q.append([dy,dx])
elif arr[dy][dx] == 0:
arr[dy][dx] = 1
q.append([dy,dx])
for i in range(M):
if arr[0][i] == 0: # 침투가 가능한 제일 위쪽 (outer side)만 탐색하여 0이라면 함수 실행
arr[0][i] = 1
bfs(0,i)
print(f"{flag}")
왜 틀렸을까?
bfs 함수에 들어가기전 if문 조건에 오타가 있었다. if arr[0][i] == 1: 로 잘못 입력했었는데도 채점이 50%이상 진행되어서 이쪽 부분을 다시 볼 생각을 못했다.