본문 바로가기

Programmers/프로그래머스

(60)
[Programmers] 땅따먹기 #include #include #define MAXX 100001 using namespace std; int sum[100001][4]; int answer = 0; int max(const int &a, const int &b) { if (a > b) return a; else return b; } int solution(vector land) { // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다. //바로 이전 행에서 밟은 행을 또 밟을 수 없다. int n = land.size(); for (int i = 0; i < 4; i++) { sum[0][i] = land[0][i]; } for (int i = 1; i < n; i++) { for (int j = 0; j < 4; j++) { f..
[Programmers] 문자열 압축 #include #include #include using namespace std; //제일 앞에서부터 일정한 길이로 잘라서 가장 짧게 압축되는 경우를 찾는다. int min(const int &a, const int &b) { if (a >= b) return b; return a; } int solution(string s) { int answer = s.size(); for (int i = 1; i 1) { //이전에 같은 문자열이 포함되어있다면 //cnt가 1자리수이면 1, 2자리수이면 2 len += to_string(cnt).size(); //자리수를 더해준다. } len += cur.length(); cnt = 1; prev = cur; } } //len은 최종 압축 문자열의 길이 if (..
[Programmers] 가장 긴 팰린드롬 *O(n^2)로 해결 O(n)으로 하는 방법은 없을까..? *dp를 이용해서 i는 시작점 / j는 도착점으로 간주해서 팰린드롬이면 dp[i][j] = true 로 저장한다. *자기 자신은 항상 팰린드롬 aa, bb -> 길이가 2인 팰린드롬 *for (len => 비교할 길이) for (시작점-> n-len) int j = 도착점 if (s[i] == s[j] && dp[i+1][j-1] : 범위를 좁혀가면서 팰린드롬인지 확인) dp[i][j] = true; answer의 최대값을 비교한다. #include #include using namespace std; bool dp[2500][2500]; int solution(string s) { int answer=1; // [실행] 버튼을 누르면 출력 값을..
[Programmers] N-Queen *퀸은 세로, 가로, 대각선에 있는 말을 한 번에 공격할 수 있으므로, 한 줄에 한 개씩만 배치될 수 있다. 즉, 최대 n개의 말만 배치될 수 있다. (종료조건) *맨 윗 칸에 퀸을 한 개씩 놓아보면서 dfs를 통해 모든 경우를 살펴본다. [0][0] 에 퀸이 놓였으면 이제 각 줄의 [0]번째 칸에는 퀸이 놓일 수 없다. (chk[0] = true를 해서 구별했다) *check(x, y, n)에서 현재 칸에서 왼쪽 위 대각선, 오른쪽 위 대각선을 살펴보면서 퀸을 놓을 수 있는지 확인한다. *놓을 수 있다면 퀸을 놓고, 다음 줄을 본다. (백트래킹) #include #include using namespace std; bool map[12][12]; bool chk[12]; int answer = 0; b..
[Programmers] 방문 길이 *set을 이용해서 좌표와 방향을 저장 / 지나온 길도 저장 #include #include #include #include #include using namespace std; typedef pair pp; typedef pair ipp; typedef pair pppp; set s; set visited; int dx[4] = {1,-1,0,0}, dy[4] = {0,0,1,-1}; int solution(string dirs) { int answer = 0; int x = 0, y = 0; int dir = 0; for (int i = 0; i < dirs.size(); i++) { switch(dirs[i]) { case 'U': dir = 0; break; case 'D': dir = 1; br..
[Programmers] 종이접기 *BOJ의 드래곤커브와 비슷한 규칙으로 풀이하며 된다. *n번 접을 때의 배열 사이즈는 2^n -1이다. *가장 중앙값은 항상 [0] 이고 ((V) 로 접힐 수 밖에 없는 부분이니까) 0부터 mid-1 의 값들과 mid+1~2^n-2 까지의 값들은 반대로 대칭된다. (1-> 0 / 0->1) #include #include #include #include using namespace std; vector solution(int n) { vector answer; //정중앙을 중심으로 대칭 int size = pow(2, n)-1; vector res(size); res[0] = 0; for (int i = 1; i < n; i++) { int size = pow(2, i+1)-1; //현재 사이즈 int..
[Programmers] 등굣길 문제 설명 계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m = 4, n = 3 인 경우입니다. 가장 왼쪽 위, 즉 집이 있는 곳의 좌표는 (1, 1)로 나타내고 가장 오른쪽 아래, 즉 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다. 격자의 크기 m, n과 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles이 매개변수로 주어집니다. 집에서 학교까지 갈 수 있는 최단경로의 개수를 1,000,000,007로 나눈 나머지를 return 하도록 solution 함수를 작성해주세요. 제한사항 격자의 크기 m, n은 1 이상 100 이하인 자연수입니다. m과 n..
[Programmers] 튜플 (python) def solution(s): #문자열에서 가장 많이 나타난 수대로 순서가 정해진다. answer= [] s = s.replace('{', '') s = s.replace('}', '') nums =list(map(str, s.split(','))) nums_dict = {} for i in nums : tmp = int(nums_dict.get(i,'0')) nums_dict[i] = tmp+1 nsorted = sorted(nums_dict.items(), key = lambda x : x[1], reverse = True) print(nsorted) for i in nsorted : answer.append(int(i[0])) # counter = collections.Counter(nums); #..