문제는 여기에서 풀 수 있습니다.

 

 

bfs를 쓸까 하다가 경로의 개수가 상당히 많아지는 것을 보고 dp를 써야겠구나 싶었습니다.

 

진행방향이 오른쪽이나 아래 뿐이므로, 순차적으로 가능성의 개수를 dp로 풀어나가면 됩니다. 

 

dp배열의 값을 [가능성의 개수]로 정의했기 때문에 초기값(dp[0][0])을 1로 설정하고 NXN배열을 순차적으로 탐색합니다. 탐색 방향과 점프 방향이 같으므로, 딱히 가지치기 할 케이스가 없습니다.

 

문제를 풀면서 신경써야했던 부분은 가장 오른쪽 아래 칸에서 dp연산을 수행하지 않는 것과 경로의 수가 int범위를 넘어가므로 dp배열을 long long으로 선언하는 것이었습니다.

 

시간복잡도는 O(N^2)이고 N<=100이므로 빠르게 문제를 풀 수 있었습니다.

 

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <cmath>
#include <map>
#include <queue>
#include <stack>
#include <unordered_set>
#include <cstring>
using namespace std;

int arr[101][101];
long long dp[101][101];

// main function
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int N;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
			cin >> arr[i][j];
	}

	dp[0][0] = 1;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (arr[i][j])
			{
				if (i + arr[i][j] < N)
					dp[i + arr[i][j]][j] += dp[i][j];
				if (j + arr[i][j] < N)
					dp[i][j + arr[i][j]] += dp[i][j];
			}
		}
	}

	cout << dp[N - 1][N - 1];

	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 11048 이동하기  (2) 2020.01.12

1. 2019

2019년은 쉬기도 많이 쉬었지만 여러 일들이 있었던 한 해였다.

면접을 준비하며 자료구조, 알고리즘 같은 기본기를 닦으면서 공부한 내용들을 블로그에 정리해두고 싶었는데, 게으름 때문에 글을 하나도 작성하지 못해서 개인적으로 많이 속상하다. 변명을 좀 하자면 정확한 내용을 명료하게 전달할 수 있을까.. 하는 걱정도 Aㅏㅏㅏㅏㅏ주 조금 있었던 것 같다!

그러나 결과적으로 정말 감사하게도 원하는 기업에서 개발자로서 일을 할 수 있게 된 점은 매우 긍정적이다. 하루빨리 현업에서 개발 스킬을 이것저것 배워서 개발자로서 성장하고 싶었는데, 내년부터 신나게 성장할 수 있을 것 같아 매우 기쁘고 설렌다!

사실 혼자서도 성장할 방법이 여럿 있지만, 뭔가 스스로 만든 벽에 갇혀 그러지 못한 것 같아서 아쉽다.

내년부터 짬이 날 지는 모르겠지만, 혼자서 이런저런 프로젝트를 진행해보고 싶다.

어디 적지는 못했지만 2019년의 개발자로서의 목표라면 1일 1커밋, 기술 블로깅, 개인 프로젝트 진행 정도가 있었는데, 놀랍게도 하나도 성취하지 못했다!

1일 1커밋은 알고리즘 공부 겸 코딩테스트를 대비하며 푼 문제들을 커밋하여(사실상 1일 1커밋 이라기보다는 1일 1문제에 더 가까웠다) 7월부터 잡초를 심었지만 매일매일 꾸준히 문제를 푼다는 게 여간 쉽지가 않았다. 코테와 면접을 준비하며 더욱 지켜보려고 노력해봤지만, 잡초 사이의 듬성듬성 회색 시멘트를 덮지 못했다...ㅜㅜ 그래도 시작이 반이라는 말에서 용기를 얻어 앞으로 점점 나아지는 내가 됐으면 좋겠다.

기술 블로깅과 개인 프로젝트는 충분히 시간을 내서 할 수 있었지만 우선순위가 낮다는 핑계로 진행하지 못했다ㅠ

2. 2020

따라서 앞으로 2020년에 대한 다짐은!

  1. 입사 후 부단히 노력하기

  2. 2019 후기 작성

  3. 블로그와 함께 성장하기

  4. 블로그 이전

  5. 건강 챙기기

로 5가지만 해보려고 한다. 한 손으로 꼽을 정도니 과하지 않을 거라 걱정 섞인 확신을 해본다!

2.1 입사 후 부단히 노력하기

9주간 예정된 신입교육 후 부서 배치를 받게 된다. 예정된 교육에서도 최선을 다해서 참여하고 교육시간 외에도 예습 혹은 복습을 병행하거나 기술적인 내용을 블로그에 정리하면 좋을 것 같다.

교육 이후 부서에 배치받고 나서는 팀에 적응을 최우선으로 하고 개발자로서의 역할을 다 할 수 있도록 열심히 공부할 생각이다. 많이 부족할게 분명하니 쉽지 않은 기간이 될 것 같다. 힘들겠지만 2019년에 쉰 만큼 열심히 달릴 때라고 생각한다ㅋㅋㅋ.

깃허브 커밋 수에 대해서는 크게 신경 쓰지 않으려고 한다. 그렇다고 아예 놓는 것이 아니라 부담을 덜 가지는 게 좋을 것 같다. 물론 1일 1커밋은 분명 의미 있는 업적이지만, 진정으로 코딩 습관이 잡히면 그때부터 시작해도 늦지 않을 것 같다.

2.2 2019 후기 작성

이번 취업을 목표로 했을 때 검색을 통해 코테나 면접 후기들을 여럿 봤는데, 상당한 도움이 되었다. 개인적으로 여러 기업에 지원하고 얻은 그간의 경험들을 글로 남기면 또 다른 누군가에게는 도움이 되지 않을까.. 하는 마음에 시간 날 때마다 기억을 더듬어 보안 서약을 위배하지 않는 범위 내에서 작성해보려고 한다.

2.3 블로그와 함께 성장하기

사실 그간 블로그에 대한 열망은 꽤나 있는 편이었다. 뭔가 기록을 남기는 것이 장기적으로도 좋아 보였고, 스스로 기술적인 내용을 정리해두면 나중에 복습하기에도 유용할 것 같았다. 하지만 첫 단추 꿰는 게 가장 어렵듯이 어떤 내용부터 어떻게 작성해야 할지 좀 막막했던 부분, 정확한 내용을 전달하지 못하면 어떡하나에 대한 걱정, 일기 같은 글을 세상에 노출시키는 것에 대한 부담, 몇 개의 글을 작성해 본 결과 완성도 있는 글을 작성하려면 생각보다 많은 노력이 필요하다는 점 등의 이유들이 블로깅의 길을 가로막았다.

앞으로는 처음부터 완벽할 필요는 없다는 마인드로 어떤 내용이든 기회가 되는대로! 최대한 정확한 정보를 바탕으로, 만약 그렇지 못하다면 지적을 언제든지 수용하는 자세로! 부담이 되는 만큼 스스로를 더 다잡는 계기로! 블로그를 운영하려고 한다. 글 하나를 완성하는데 시간이 꽤나 필요한 부분은... 점차 노하우가 쌓이다 보면 나아지기를 바란다ㅜㅜ

1년간 반드시 글 몇 개 쓰기 같은 정확한 목표는 세우지 않으려고 한다. 목표를 낮게 잡아도, 높게 잡아도 문제인 것 같아서 어느 정도가 적당한 목표인지 모르겠다. 그냥 되는대로 최대한 열심히 글을 쓰려고 한다!

2.4 블로그 이전

현재 티스토리를 통해 블로그를 운영하고있는데(운영이라기엔 죽은 블로그이지만) 점차 jekyll + 깃허브로 이사를 생각하고 있다. 운영이 더 어려워지겠지만 그만큼 자유롭게 운영할 수 있다는 점이 매력적이었다. 언제가 될지는 모르겠지만 가능한 한 빨리 이사 가고 싶다. 단순한 호기심 때문에...ㅎㅎㅎ

2.5 건강 챙기기

최근 아는 분께서 뇌출혈로 쓰러지셨다고 들었다. 너무도 마음 아픈 일이었는데, 더욱 건강에 대해 경각심을 갖게 되었다. 평소에도 건강에 신경을 많이 쓰는데, 이제 일을 시작하는 만큼 체력적으로 모자라지 않도록 건강을 더 신경 써서 관리해야겠다는 생각이 들었다. 사소한 거는 잘 챙기는 편이라 운동을 좀 더 하면 좋을 것 같다. 원래 한동안 수영을 다니고 있었는데 수질이 좀 좋지 않은 것 같아서 헬스를 시작할까 고민 중이다. 집에서 맨몸 운동 루틴을 잡는 것도 좋아 보이고... 고민이 좀 더 필요한 문제 같다. 중요한 것은 건강을 잃지 않도록 최선을 다할 것!

2020년 연말에 2020 & 2021이라는 글을 쓸 때 얼마나 잘 지켰나 회고하는 시간이 기대된다. 부끄럽지 않도록 멋진 한 해를 보내야겠다!

'일상' 카테고리의 다른 글

2020 상반기 후기  (0) 2020.09.12

윈도우에서 맥으로 넘어오면서 가장 불편한 것이 한/영 전환이었습니다.

 

대중적으로 알려진 방법과 제가 겪었던 시행착오를 공유하는 포스트입니다.

 

먼저 https://pqrs.org/osx/karabiner/ 으로 들어가셔서

핑크색 박스를 클릭해줍니다.

Karabiner은 키보드의 키와 실질적으로 동작하는 키를 커스터마이징 할 수 있는 앱입니다.

 

이 앱을 사용해서 right-command로 지정되어있는 한/영 키를 실제로 한/영 기능 키와 매핑하는 것이 이번 포스팅의 핵심입니다.

 

앱을 설치해주시면 보안관련 권한을 허가해달라고 하는데, 다 해줍니다.

 

그리고 앱을 실행하시면

 

 

다음과 같은 화면을 볼 수 있습니다. 역시나 핑크박스 클릭.

 

왼쪽 박스를 right_comand로, 오른쪽 박스를 f13(f13~f20중 아무거나 상관없습니다)로 선택합니다.

 

f13은 원래 사용하지 않는 키로, 한/영 전환 키와 실질적인 한/영 전환 기능을 연결하는 다리 역할을 하게 됩니다.

 

이제 한/영 전환 기능과 f13키를 매핑할 차례입니다.

 

아래 사진과 같이 시스템 환경설정 > 키보드 > 단축키 > 입력 소스 > 이전 입력 소스 선택   을 선택합니다.

 

아마 기본값이 ^스페이스 로 설정되어있을텐데, 윈도우에서 사용하던 한/영 전환 키를 눌러주시면 F13으로 변경됩니다.

 

Karabiner로 한/영 전환 키가 F13처럼 동작하게 매핑시켜놨기 때문이죠.

 

수고하셨습니다. 이제 한/영 전환을 윈도우처럼 사용할 수 있습니다!

 

 

=====================================================================================================

위 방법으로 문제를 해결하셨다면 아래 포스트는 읽지 않으셔도 됩니다.

=====================================================================================================

 

만약 "이전 입력 소스 선택" 에서 한/영 전환 키를 눌러도 F13이 선택되지 않는다면,

 

그건 사용하는 키보드에서 한/영 전환 키가 맥에서 right_command 키로 인식되지 않았다는 뜻입니다.

 

이런 경우에는 right_command 대신 right_option 이나 right_control 로 변경하면 문제가 해결됩니다.

 

 

 

이래도 해결되지 않은 경우는 댓글 달아주시면 도와드리겠습니다.

좋은 하루 보내세요!

 

'맥 관련' 카테고리의 다른 글

[python3] pipenv에서 python mysqlclient 설치  (0) 2021.08.15
[mac세팅] teminal → iTerm2 (feat. zsh)  (2) 2020.05.09

안녕하세요,


개인 프로젝트를 진행하다가 블로깅을 해보면서 그 과정을 남기면 어떨까...하는 심정에서 블로그를 만들게 되었습니다.


이 글이 그 첫 발걸음인데요, 먼저 구글 api를 사용하면서 겪었던 과정들을 글로 남기려고 합니다.


저와 같은 오류를 겪으신 분들에게 힘이 되기를 바라며, 글을, 블로깅을 시작하도록 하겠습니다.


https://console.cloud.google.com/

위 링크를 따라가시면 구글 api를 사용할 수 있는 Google Cloud Platform 페이지가 열립니다.


다들 구글 계정은 있으시겠죠?

로그인 하시고 좌측 상단의 메뉴 버튼(가로로 세줄)을 누르시면 위 화면과 같은 창이 뜹니다.


좌측 메뉴 중에서 '결제' 카테고리를 클릭하신 후 무료 체험 비슷한 걸 신청하시면 됩니다.


현재 저는 이미 신청한 상태라 화면을 긁어올 수 없네요ㅠㅠ


알아서 잘 하시리라 믿고 궁금하신점 있으시면 댓글로 남겨주시면 최대한 빨리 답변 드리겠습니다.




Google Cloud Platform 사용 권한을 얻으셨다면 이제 사용할 api를 선택해봅시다.

좌측 메뉴에서 API 관리자를 클릭합니다.


\



클릭 후 형광펜 칠한 'API 사용 설정' 을 클릭합니다.



사용하려는 API 관련 키워드를 입력하고 검색하여 사용하려는 API를 클릭합니다.


저같은 경우는 Speech 관련 API를 사용하기 위해서 speech를 검색하여 Google Cloud Speech API를 클릭했습니다.



저는 이미 해당 API를 사용중이기 때문에 위 화면과 같이 나타나지만, 사용 전에는 '사용' 같은 버튼이 있을겁니다.


그걸 클릭해주시면 제 화면처럼 바뀌고, 해당 계정에서 선택한 API를 사용할 수 있게 되었습니다!


*한가지 중요한 점은, API를 사용하기 전에



미리 만들어 놓은 프로젝트에 한해서만 선택한 API 사용 권한이 적용된다는 점입니다.


이 룰을 지키지 않으시면 추후의 과정에서 오류가 나타날 수 있습니다ㅠㅠ


역시나 관련 질문은 댓글 남겨주시면 최대한 빨리 답변드리겠습니다.



이제 다시 API 관리자로 돌아와서, 형광색칠 된 '사용자 인증 정보'를 클릭합니다.



그리고 '사용자 인증 정보 만들기' 를 클릭합니다.


이 '사용자 인증 정보' 는 json 파일로 이루어진, 개발자가 구글 api를 사용하기 위한 권한을 인증해주는 파일의 정보 라고 이해하시면 좋습니다.


'서비스 계정 키' 를 선택합니다.



서비스 계정 이름을 설정하고(사용자 임의), 역할은 개발에 필요한 옵션을 선택하시면 됩니다만, 가급적 '소유자'를 선택하는 것이 편할 것 같습니다. 물론 필수는 아닙니다.


키 유형은 json파일을 추천합니다. 보편적으로 많이 사용하거든요.


이제 [생성] 버튼을 눌러주시면 

다음과 같은 팝업이 뜹니다. 디폴트 다운로드 경로로 json파일이 저장됩니다. 이제 해당 json파일을 GOOGLE_APPLICATION_CREDENTIALS 환경변수로 지정하여 인증하면 선택한 구글 API를 사용할 수 있습니다!


저같은 경우 라즈베리파이에서 음성인식을 하기 위하여 Speech api를 사용했는데요, 그 과정은 따로 포스팅 하도록 하겠습니다.


여기까지 구글 api 사용을 위한 간단한 과정을 소개하는 포스트였습니다.


도움이 되셨길 바라며, 더 좋은 포스팅으로 돌아오겠습니다!

+ Recent posts