부등호 k개인 부등식이 주어지면, 그 사이에 0~9 사이의 숫자를 넣어서 부등식이 충족되는 숫자를 찾습니다.
숫자의 최소, 최대 숫자를 출력합니다.
풀이
부등호 리스트를 받습니다.
부등호 맨 앞에 숫자를 다 넣습니다.
숫자가 k + 1 만큼 채워지면 최소, 최대인지 확인합니다.
숫자가 k + 1 보다 작다면 현재 비교해야할 부등호와, 부등호 앞에 있는 숫자(A) 를 확인합니다.
숫자를 중복해서 사용하면 안되므로, 0 ~ 9까지 이전에 사용된 숫자라면 넘깁니다.
부등호가 '>' 라면, 'A > i' 가 만족되어야 하므로 A보다 작은 숫자만 함수에 넣어줍니다.
부등호가 '<' 라면, 'A < i' 가 만족되어야 하므로 A보다 큰 숫자만 함수에 넣어줍니다.
코드
from sys import stdin
input = stdin.readline
N = int(input())
sign_list = list(input().split())
min_num = 9999999999
max_num = 0
result = ['', '']
def backTraking(nums):
global min_num
global max_num
len_num = len(nums)
if len_num == N + 1:
str_nums = ''.join(map(str, nums))
int_nums = int(str_nums)
min_num = min(min_num, int_nums)
max_num = max(max_num, int_nums)
if min_num == int_nums: result[1] = str_nums
if max_num == int_nums: result[0] = str_nums
return
index = len_num - 1
sign = sign_list[index]
num = nums[index]
# 사용 가능한 숫자
for i in range(10):
if i in nums: continue
if sign == '>':
if i < num:
backTraking(nums + [i])
if sign == '<':
if i > num:
backTraking(nums + [i])
for i in range(10):
backTraking([i])
for i in result:
print(i)
시작할 때 최소 거리는 바로 옆집이므로 1 이고, 최대 거리는 주어진 좌표의 끝과 끝이다.
현재 집에서 중간 거리 ((최소 + 최대) // 2) 보다 큰 집에 공유기를 설치한다.
중간 거리에 대해 공유기를 설치한 것이 보유한 공유기 (C) 보다 더 많은 경우, 거리를 더 줄여야 한다. 반대로 공유기를 더 적게 사용한 경우 거리를 더 늘려도 된다.
코드
from sys import stdin
input = stdin.readline
N, C = map(int, input().split())
house = [int(input()) for _ in range(N)]
house.sort()
start, end = 1, (house[-1] - house[0])
result = 0
while start <= end:
mid = (start + end) // 2
cur = house[0]
count = 1
for i in range(1, N):
if house[i] >= cur + mid:
count += 1
cur = house[i]
if count >= C:
start = mid + 1
result = mid
else:
end = mid - 1
print(result)
모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정합니다. ex. [10, 10, 10, 20] 의 예산을 요청 받았고, 총 금액이 50이라면 국가 예산 총액에서 요청한 금액들을 모두 배정할 수 있습니다. 즉, [10, 10, 10, 20] 예산 그대로 배정됩니다.
모든 요청이 배정될 수 없는 경우에는 특정한 정수 상한액을 계산하여 그 이상의 예산 요청에는 모두 상한액을 배정합니다. 상한액 이하의 예산 요청에 대해서는 요청한 금액을 그대로 배정합니다. ex. [110, 120, 140, 150]의 예산을 요청 받았고, 총 금액이 485인 경우에 상한액을 127로 잡으면 [110, 120, 127, 127]의 예산이 배정됩니다.
출력
배정된 예산들 중 최댓값인 정수를 출력합니다.
풀이
from sys import stdin
input = stdin.readline
N = int(input())
# 요청한 예산
prices = list(map(int, input().split()))
# 국가 예산의 총액
total = int(input())
# 국가 예산의 총액으로 배정가능할 경우 최댓값을 출력합니다.
if sum(prices) <= total:
print(max(prices))
else:
start, end = 0, max(prices)
while start <= end:
# 중앙값을 가져옵니다.
mid = (start + end) // 2
# 현재의 중앙값을 상한액으로 보았을 때, 총합을 계산합니다.
result = 0
for i in prices:
if i > mid:
# 상한액 이상의 예산요청에는 모두 상한액을 배정한다.
result += mid
else:
# 상한액 이하의 예산요청에 대해서는 요청한 금액을 그대로 배정한다.
result += i
# 국가 예산 이하인 경우
if result <= total:
start = mid + 1
# 국가 예산에 초과인 경우, 상한액을 내립니다.
else:
end = mid - 1
print(end)
회사 동료분께 추천받은 것도 있고, 최근에 회사에서 감정 소비가 컸던 부분이 일정한 패턴으로 나타난다는 사실을 깨닫게 되어서 저에 대해서 알고 싶어졌습니다. 제가 힘들었던 것은 예상하지 못한 일을 요청받았을 때, 반드시 그 일을 해야한다는 생각과 제가 이전에 세웠던 계획에 충돌이 일어나면서 갑작스러운 일과 계획한 일을 완수하지 못했을 때 자책하는 패턴이었습니다.
강점 진단에 대해서는 책에서 다음과 같이 설명하고 있습니다.
강점 진단은 지금까지 당신이 알아온 시험과는 다르다. 당신이 세상을 어떻게 느끼는지 측정하고, 당신이 어떤 사람인지 이해한다. 또한, 당신의 내부에 어떤 것들이 존재하는지, 그리고 당신을 이끄는 힘이 무엇인지를 수치화하여 밝혀줄 수 있는 유일한 시험이다.
강점 진단은 당신이 가진 자연적인 힘을 파악한다. 진단 결과도 색다르다. 무엇이 자신에게 가장 잘 맞는지를 보여주기 때문이다.
강점 진단을 한 후에는 저의 특성과 어떤 상황에서 스트레스를 받는지, 그 상황을 어떻게 피하거나 해결할 수 있는지 등을 이해하는데 도움이 되었습니다.
아래의 부분은 저의 검사 결과이고, 이후 제가 다시 보기 위해 특성을 정리하고자 쓴 글입니다.
강점 5가지 결과를 받고나서는, 나머지 부분도 궁금해져서 추가 결제를 했습니다. 💸
강화하기 섹션에 있는 것들이 저의 강점이고, 그 중 1~5가 가장 강한 테마입니다.
아래의 내용은 책의 테마 내용을 정리한 것입니다.
1. 책임 테마
당신이 하겠다고 한 것은 끝까지 책임진다. 어떤 이유로든 책임을 이행하지 못하면, 자동적으로 상대방에게 보상할 방법을 찾기 시작한다.
가까운 미래에 당신에게 도움을 청하는 사람들이 있을 것이다. 누군가 도움을 청할 때에는 반드시 선별해서 책임을 맡아야 한다. 도와주고 싶은 마음에 이끌려 감당할 수 없을 만큼 너무 많은 일을 떠맡을 수도 있다.
실행 아이디어에서 눈여겨 본 글
거절하는 것도 책임지는 것임을 알아야 한다. 당신에게 책임감은 본능적인 것이어서 다른 사람의 제안이나 부탁을 거절하지 못한다. 바로 이러한 이유 때문에 더더욱 신중하게 책임질 일을 선택해야 한다. 더 많은 책임은 당신에게 가장 중요한 영역에 해당하는 경우에만 맡자.
당신은 참여하는 모든 프로젝트에 대해 지극히 당연하게 주인의식을 갖는다. 그런 주인의식 때문에 다른 이들과 나눠야 할 책임을 혼자 짊어지지 말자. 다른 사람들도 주인의식을 가져야 한다. 그래야 그들도 조직의 성장과 발전에 기여할 수 있다.
당신은 책임 테마를 관리하는 법을 배워야 한다. 자신이 특정 문제를 처리하는 데 적합한 인물인지 생각해보자. 다른 일을 더 책임지기 전에 이미 맡고 있는 책임과 목표를 살펴보자. 너무 많은 업무를 맡거나 상충되는 요구가 있다면 품질이 떨어질 수 있다.
체계나 집중 테마가 특히 강한 사람과 파트너 관계를 맺자. 이들은 당신이 정해진 궤도를 지키면서 과도한 부담을 지지 않도록 도와줄 것이다.
책임 테마의 소유자는 자신이 약속을 '지켰는지' 알고 싶어한다. 의무를 얼마나 효율적으로 충족했는지 측정할 수 있는 측정 기준과 목표를 세우자. 또한 수준 높은 결과에 관해 이견이 없고 약속한 대로 목표를 달성할 수 있도록 기대치를 명시적이고 구체적으로 정해두자.
2. 화합 테마
사람들이 서로 동의하는 부분을 찾는다. 당신은 갈등과 충돌에서 얻을 것이 없다고 생각하기 때문에 그것을 최소한으로 줄이려고 한다. 주위 사람들의 견해가 서로 다르다는 것을 알게 될 때, 당신은 공통점을 찾으려고 노력한다. 그들이 갈등에서 벗어나 화합을 이룰 수 있도록 노력한다.
당신은 사람들이 자신의 견해를 타인에게 강요하는 데 너무나 많은 시간을 낭비한다고 생각한다. 당신은 우리 모두가 한 배를 타고 있고, 이 배를 우리가 가려는 곳에 이르도록 해야 한다고 생각한다. 이 배는 나무랄 데가 없다. 그렇기에 단지 우리 능력을 과시하기 위해 배를 흔들어댈 필요는 없는 것이다.
실행 아이디어에서 눈여겨 본 글
매일 사람들을 만나야 하는 역할은 피하는 것이 좋다. 예를 들어 전화 접촉 또는 방문 방식의 영업직이나 경쟁이 심한 직장은 당신을 좌절시킬 것이다.
대립하지 않고 갈등을 해결하는 법을 알아야 한다. 그러지 않으면 화합 테마는 갈등을 회피하기에 급급하여 해결은 못할 수도 있다. 그러다 수동적 공격성을 지닌 행동을 하게 될 수 있다.
주도력이나 행동 테마가 특히 강한 사람과 파트너 관계를 맺자. 갈등을 해소하려는 모든 노력이 수포로 돌아갔을 때 갈등 상황을 정면 돌파하도록 도와줄 것이다.
당면한 과제와 관련없는 논쟁이 있을 시에는 주저하지 말고 개입하여 실질적인 문제로 대화의 방향을 돌려야한다. 경청과 효율성 사이에서 균형을 유지하는 것이 화합의 열쇠이다.
3. 배움 테마
배우는 과정에서 재미를 느낀다. 당신은 배우는 내용이나 배움의 결과보다도 과정에 더 흥미를 느낀다. 무지에서 앎으로 꾸준하게 계획적으로 발전해가는 과정에서 활기를 얻는다.
역동적인 업무 환경 속에서 탁월한 능력을 발휘한다. 시시각각 변화하는 비즈니스 환경에서는 새로운 분야에 대한 다량의 지식을 단기간에 습득한 후 프로젝트를 단기에 완수하고 곧바로 다음 프로젝트로 넘어갈 수 있는 능력이 필요하기 때문이다.
실행 아이디어에서 눈여겨 본 글
최선의 학습 방법을 정리해보자. (현재 저의 경우에는 조용히 혼자 정리하는 시간이 필요하면 학습에 큰 도움이 됩니다.)
학습 진도를 추적하자. 예를 들어 주제 하나에 대해 책 다섯권 읽기나 PPT 3개 만들기 등이다.
기술적 역량이 필요한 역량을 찾아보자. 당신은 전문 지식을 얻고 유지하는 과정을 즐길 것이다. 가능하다면 기술 또는 규정이 꾸준하게 변하는 분야의 직업을 갖는다. 계속 배움에 도전할 때 활기를 얻는다.
4. 체계 테마
당신의 세계는 예측 가능해야 한다. 질서 정연하고 계획되어 있어야 한다. 그래서 당신은 본능적으로 일상을 체계화시킨다. 일과를 정하고, 스케쥴과 마감 날짜같은 시간 계획에 주력한다. 장기적인 과제 수행을 위해 구체적인 단기 계획을 세우고, 부지런히 각 계획은 실행한다.
혼란스러운 삶 속에서 상황을 통제하고 있다는 느낌을 원하기 때문이다.
실행 아이디어에서 눈여겨 본 글
실수를 저지르면 의기소침해질 수 있다는 사실을 받아들이자. 치계 테마의 핵심이 정확성이긴 하지만 후회스러운 실수 때문에 낙담하지 않기 위해서는 의기소침한 순간을 돌파하는 방법을 찾아야 한다.
모든 사람이 체계적일 수는 없다. 어쩌면 당신은 사람들의 두서 없는 방식 때문에 좌절감을 느꼈을 수도 있다. 그 너머의 것을 볼 수 있도록 그들의 방식이 아닌 결과에 초점을 맞추자.
정밀성은 체계 테마의 장점이다. 당신은 자세히 살펴보는 것을 즐긴다.
체계 테마는 효율성을 향상시킨다. 체계 테마의 소유자는 완벽주의자다. 비효율성 때문에 시간이나 비용이 낭비되는 상황을 파악하고 효율성을 향상시킬 수 있는 체계나 절차를 마련하자.
타임라인은 당신에게 동기부여가 된다. 단계별 계획을 짜서 적용해보자.
체계화된 역할과 책임을 찾아보자.
5. 공감 테마
주위 사람들의 강점을 매우 잘 느낀다. 상대방의 감정을 본능적으로 이해할 수 있는 능력에는 강력한 힘이 있다.
상대방이 말하지 않아도, 무엇을 궁금해하고, 어떤 것이 필요한지 예측할 수 있다. 사람들이 감정을 어떻게 표현해야 할지 몰라 고민할 때도 당신은 적절한 단어는 물론 적절한 어조까지 찾아내곤 한다.
실행 아이디어에서 눈여겨 본 글
주도력 또는 행동 테마가 강한 사람과 파트너 관계를 맺자. 그들이 다른 사람을 불편하게 만들더라도 당신이 그들에게 필요한 조치를 취할 수 있게 도와줄 수 있을 것이다.
간혹 남을 위한 공감력이 당신을 압도할 수 있다. 하루의 일과가 끝날 때 업무가 완료되었음을 알려주는 의례적인 절차를 만들어보자. 당신의 감정을 보호하고 정서적으로 녹초가 되는 것을 막을 수 있다.
공감 테마가 강한 친구를 찾아 당신이 관찰한 내용이 맞는지 확인해보자.
어떤 일이든지 세상에 널리 알려지기 전에 상황이 어떻게 벌어질지 직감적으로 안다. 당신의 직감은 간혹 '예감'처럼 보일 수 있지만 이런 직감에 의식적으로 주목하자. 이 직감은 귀중한 자산이 될 수 있다.
정리를 해보니 위에서 말했던 감정 소비가 큰 부분의 이유를 찾을 수 있었습니다.
앞으로는 제가 할 수 있는 범위에서만 요청을 받고, 요청을 받더라도 처음에 목표와 시간이 정확하게 받으면 해결되겠다는 생각이 드네요.
풀이: 비어있는 좌표를 저장하고, 해당 좌표를 기점으로 행, 열, 네모 안에 사용된 숫자를 제외한 숫자를 사용하여 하나씩 넣어보면서 스도쿠가 완성될 수 있는 숫자값을 찾습니다.
import sys
input = sys.stdin.readline
sudoku=[list(map(int,list(input().rstrip()))) for _ in range(9)]
blank = [(i,j) for i in range(9) for j in range(9) if sudoku[i][j]==0]
def find(n):
if n == len(blank):
for i in sudoku:
print(''.join(map(str,i)))
return True
i,j = blank[n]
total_number = set([num for num in range(1,10)])
# 행, 열, 네모에 사용된 것
used = set(sudoku[i] + [sudoku[r][j] for r in range(9)] + [sudoku[r][c] for r in range(3*(i//3),3*(i//3)+3) for c in range(3*(j//3), 3*(j//3) +3)])
for num in sorted(total_number - used):
sudoku[i][j] = num
if find(n+1):
return True
sudoku[i][j] = 0
return False
find(0)
문제: 도시의 수와, 여행에 갈 도시의 수, 도시 간의 연결을 인접행렬로 받습니다. 이 정보들을 통해 계획한 도시들을 여행할 수 있는지 확인하는 문제입니다.
풀이: Union-find를 사용하여, 연결된 도시를 한 집합으로 묶습니다. 마지막에 여행할 도시들을 번호로 받는데 해당 번호들의 부모를 확인하고, 부모가 하나가 아니면 이 여행은 갈 수 없습니다.
import sys
input = sys.stdin.readline
N,M = int(input()), int(input())
parent = [i for i in range(N+2)]
#Root node 찾기
def find(x):
if x== parent[x]:
return x
else:
root_x = find(parent[x])
parent[x] = root_x
return parent[x]
def union(x,y):
root_x = find(x)
root_y = find(y)
if root_x != root_y:
parent[root_y] = root_x
else:
return
# 연결된 도시들을 한 집합으로 봅니다.
for i in range(1,N+1):
link = list(map(int,input().split()))
for j in range(1,len(link)+1):
if link[j-1] == 1:
union(i,j)
#여행계획을 확인합니다.
path = list(map(int,input().split()))
result = set([find(i) for i in path])
if len(result)!=1:
print('NO')
else:
print('YES')
이 글에서는 Deep Link, Dynamic Link, Universal Link가 무엇인지 정리하고자 합니다.
Deep Link란?
딥링크는 사용자를 웹 사이트나 스토어가 아닌 앱으로 직접 연결하는 링크 유형입니다. 딥 링크는 앱이 이미 설치된 경우 앱을 여는 사용자 지정 URL 체계(iOS Universal Link) 나 intent URL(on Android)을 지정하여 수행합니다. 사용자를 특정 이벤트나 페이지로 안내하도록 딥 링크를 설정할 수 있습니다.
안드로이드에서는 'Deep Link', iOS에서는 'Universal Link'의 방식으로 기능을 제공합니다.
만약 사용자가 설치하지 않은 앱에 딥 링크를 연결하면, 이 때 Deferred Deep Link(지연된 딥 링크)가 작동합니다.
Deferred Deep Link (지연된 딥 링크)
사용자가 딥 링크를 클릭했을 때 앱이 설치되지 않은 경우 App store로 갈 수 있습니다.
장점은 사용자가 앱을 설치하고 열 때, 처음에 사용자가 방문하기를 원했던 앱의 위치로 전송될 수 있습니다.
Dynamic Link (다이나믹 링크)
다이나믹 링크는 구글 파이어 베이스에서 제공하는 서비스입니다. 이것 또한 딥 링크입니다.
기존 딥링크는 안드로이드, iOS에 따라 각각 구현해야 했습니다. 하지만 파이어 베이스 다이나믹 링크는 앱이 이미 설치되어 있는지 여부와 상관 없이 여러 플랫폼에서 원하는 방식으로 작동하는 링크입니다.
Universal Link
기존 딥 링크와 차이는 없지만, Universal Link는 iOS를 실행하는 Apple 장치 전용이며, 응용 프로그램에서 웹 페이지를 열 수 있습니다.
작동 방식 : 표준 딥 링크와 유사하지만, 사용자 지정 URL 체계를 정의하는 대신에 웹 페이지 집합을 앱 내 위치와 일치시킵니다. 즉, 사용자가 일치하는 웹 페이지를 열면 iOS가 자동으로 사용자를 앱으로 리디랙션합니다.
iOS 버전 9이상에서 사용할 수 있으며, 앱이 사용자 기기에 설치되어 있지 않아도 작동하고, 설치되어 있지 않으면 사파리를 통해 웹 사이트에 연결됩니다. → 웹 사이트와 앱 모두 하나의 URL에서 작동합니다.
Deep Link가 이미 있는데, Universal Link가 존재하는 이유?
Apple에서 보안, 개인 정보 보호 및 유연성, 안정적인 시스템을 만들기 위해 만들었습니다.
Universal Link가 생성한 문제?
Right corner evil
아이폰, 아이패드의 오른쪽 상단에 있는 '탐색 경로'를 의미하며, 사용자가 앱에서 웹으로 이동했다가 다시 돌아가기 원할 때 클릭합니다.
사용자가 Universal Link를 클릭하면, iOS는 사용자의 최근 선택 사항을 확인해서 앱, 웹 중 무엇을 열지 결정합니다. 사용자가 앱에 대한 Universal Link를 클릭한 다음 이동 경로 버튼을 클릭하여 사파리에서 사이트를 열었다면, iOS는 해당 선택을 기억하고 사용자가 앱으로 가길 원해도 사파리에서 사이트를 계속 엽니다.
이는 사용자가 웹에 갇혔음을 의미합니다. 사용자가 웹 페이지의 스마트 앱 배너를 탭하는 것을 모른다면 앱을 다시 열지 못하고, 앱 개발측에서는 조치를 취할 방법이 없습니다.