본문 바로가기

[PS] 문제풀이47

[ 프로그래머스 12899 ] 124 나라의 숫자 (C++) [문제보기] [해결과정] 1. char arr배열 선언 {4, 1, 2} 2. n을 3으로 계속 나누는 반복문 수행 -> arr[ n%3 ] + answer; -> if(n%3==0) 이라면 n-=1; [소스코드] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include #include #include using namespace std; char arr[3] = {'4','1','2'}; string solution(int n) { string answer = ""; int a; while(n!=0){ a = n%3; n = n/3; if(a==0) n-=1; answer = arr[a]+answer; } return answer; } [해결 과정 중 실수한 부분.. 2020. 3. 31.
[ 백준 10026 ] 적록색약 (C++) [문제보기] [해결과정] 1. input -> n, arr 입력받기 2. 정상인 사람이 볼 때, -> arr을 순회하며, 방문체크가 안되있는 좌표를 queue에 넣고 bfs수행, -> 진입할 때, 방문체크 하고 gNum++ (그룹수) -> bfs(0) 플래그 0으로 진입 3. bfs(0) -> bfs수행 하는데, flag가 0인 부분으로 진입 4. 적록색약인 사람이 볼 때, -> 먼저 check 배열 초기화, gNum = 0으로 변경 -> 맵을 순회하며 R을 G로 바꾸거나 혹은 G를 R로 다 바꿔버림. 5. 적록색약인 사람이 볼 때 기능 실행 -> arr을 순회하며, 방문체크가 안되있는 좌표를 queue에 넣고 bfs수행, -> 진입할 때, 방문체크 하고 gNum++ (그룹수) -> bfs(1) 플래그 .. 2020. 3. 18.
[ 백준 17142 ] 연구소3 (C++) [문제보기] [해결과정] 1. input -> n, m, arr 맵 --> 빈칸(0)의 갯수 카운트 하기 : if(arr 맵 == 0) k++ 2. DFS 완전탐색 -> 맵을 순회하며, 비활성바이러스를 발견하면, -1로 변경후 다음 DFS 수행 3. DFS 수행 중 Count 개수가 m과 같다면, 기능 실행 -> check 함수 -1로 초기화 -> DFS를 통해 활성바이러스로 바꾼 좌표를 큐에 삽입 (맵==-1) -> BFS() 수행 4. inf (0을 1로 바꾼 개수) , times (걸린 시간) 변수 선언 5. while(!q.empty()) 수행 -> 4방향 탐색하며, check == -1 && arr!=1 인 곳 방문 -> 만약 arr=0 이면 방문할 때 시간으로 times 갱신, inf++ 수행.. 2020. 3. 18.
[ 백준 16236 ] 아기 상어 (C++) [문제보기] [해결과정] 1. input ( n , arr에 맵 입력받기 ) -> 주의할점! 9는 상어의 초기 위치이다. 상어 위치를 다른 변수에 담고 맵에 9가 아닌 0으로 넣는다. 2. solution 수행 (1) 현재 상어 위치를 큐에 담는다 (2) BFS 수행 -> BFS를 돌며 현재 상어크기보다 같거나 작으면 진입 -> 만약 현재 상어크기보다 작으면 잡을 수 있는 물고기 ableFish++; -> 그리고 map값에 *=-1 하며 음수로 만들기 (음수인 곳은 잡을 수 있는 물고기란 뜻) -> minFish에 가장 작은 이동거리 저장시키기 (3) BFS가 끝나면, 맵 처음부터 끝까지 순회 -> 순회하며 음수인 곳을 가장 처음 만나는 곳이 잡아야 하는 물고기. -> 물고기를 잡고, 상어가 잡은 물고기.. 2020. 3. 11.
[ 백준 1076 ] 저항 (C++) [문제보기] [해결과정] 1. input : 3가지 색깔 (string) 2. 배열을 만들고, 색깔을 인자로 받고 값을 리턴하는 함수를 만들어, 각각의 색에 return 값을 만들어 준다. 3. 1번째와 2번째 배열 값들은 그대로 출력해주고, 3번째 배열 값 만큼 0을 반복하여 출력한다. -> 예외1 : 1번째 배열 값이 0인 경우, 2번째 배열 값만 출력 -> 예외2 : 1번째 배열 값과 2번째 배열 값이 0인 경우 0을 출력 [소스코드] 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53.. 2020. 2. 29.
[ 백준 14503 ] 로봇 청소기 (C++) [문제보기] [해결과정] 1. input : n, m + 로봇 좌표 + 맵 2. 로봇 좌표와 방향을 담는 구조체와 큐 생성 후 큐에 좌표 넣기 3. 반복문 -> 큐에서 꺼낸 좌표가 청소되어있지 않다면 청소. -> 해당 좌표부터 왼쪽을 확인하며, 청소되어있지 않다면 진입. -> 만약 진입했다면 반복문 종류 후 continue; -> 만약 4방향 모두 청소되어있지 않다면 뒤로 이동... -> 만약 뒤로 이동할 수 없다면 전체 반복문 종료 [소스코드] 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52.. 2020. 2. 28.
[ 백준 2851 ] 슈퍼 마리오 (C++) [문제보기] [해결과정] 1. input : arr(int형) 배열에 10개 버섯 담기 2. sum+=arr[i] 를 진행 -> 만약 절대값 sum+arr[i] -100 arr[i]; for (int i = 0; i 2020. 2. 27.
[ 백준 17471 ] 게리맨더링 (C++) [문제보기] [해결과정] 1. input : n, arr (int형) 배열에 각각의 인원수 담기 -> 2차원 vector에 각각의 점에 간선 긋기 2. dfs(int count, int r(레드갯수), int b(블루갯수)) -> count != n+1 이라면, color에 색칠 후에 dfs(count+1, 색칠한곳+1, 색칠안한곳) 전송 -> count == n+1 이라면 아래 3번 수행 3. function -> red, blue 각각의 진영 갯수 0으로 초기화 -> redSum, blueSum 각각의 총합 0으로 초기화 -> 방문 체크 배열(check) 초기화 -> rf, bf 플래그 초기화 -> 1~N까지 점을 돌며, 레드 진영 한번, 블루 진영 한번.. 각각 한번씩 정점을 큐에 넣고 그 색에 대.. 2020. 2. 27.
[ 백준 1712 ] 손익분기점 (C++) [문제보기] [해결과정] 1. input : long long int 타입으로 a, b, c 입력 2. a + bx > cx 를 찾기 -> 예외 처리 b>=c 인 경우... [소스코드] 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 /* BOJ 1712 - 손익분기점 Created by haejun on 2020/02/27 */ #include #include #include #include #include #include using namespace std; #define ll long long int ll a, b, c; int main(){ ios_base::sync_with_stdio(0); cin... 2020. 2. 27.
[ 백준 1405 ] 미친 로봇 (C++) [문제보기] [해결과정] 1. input : n, double 형 d[4] ( 동, 서, 남, 북 ) -> d[i]/=100으로 해서 소수점으로 변환 2. 동, 서, 남, 북으로 이동하는 것을 맵에서 check 하기 위해서 map배열을 만들어준다. -> 맵의 가장 중앙 지점을 방문 처리 한다. 3. 맵의 가장 중앙 지점 부터 dfs 실행 -> dfs(y,x, cnt, p) cnt는 dfs count이고, p는 확률(소수)를 담을 변수 -> 만약, 단순한 경로(겹치지 않는 경로) 일 경우 ret += p -> 현재까지의 확률을 정답란에 저장 -> 만약, 단순한 경로가 아닌 경우(이미 방문한 지점을 방문) 패스 4. output : 소수점 11자리 까지 지정하여 출력 -> cout.precision(11);.. 2020. 2. 26.
[ 백준 3197 ] 백조의 호수 (C++) [문제보기] [해결과정] 1. 입력 받기 (n, m , arr[][]) -> 백조 구조체를 생성하여, 0번 백조 1번 백조 입력 받기. -> 물일 경우 ( . ) wq(큐)에 넣기 2. q(큐)에 0번 백조 좌표 넣기 3. 결과를 도출할 날짜 ans =0으로 셋팅 후 무한 반복문 실행 4. nq( q와 동일한 큐 )생성 5. 0번 백조 돌리기 (q를 다 돌때까지) -> 만약 X라면 nq에 좌표 넣기 -> 만약 X가 아니라면 q에 좌표 넣기 ★★★0번 백조가 돌아다닐 수 있는 범위를 탐색하는 것임! 6. q에 nq를 넣기 7. 얼음 부수기 -> int s 에 wq.size() 값 대입 -> while(s--) 반복문 BFS 실행 -> 만약 X라면 wq에 좌표 넣고 해당 좌표 값을 '.'으로 변경 ★★★ 여.. 2020. 2. 26.
[ 백준 2146 ] 다리 만들기 (C++) [문제보기] [해결과정] 1. 입력 받기 (n, arr[][]) 2. 섬 번호 메기기 -> group 변수 선언 (섬 번호 Count) -> arr 배열을 돌면서, 1이면서 방문하지 않은 곳이라면 q(큐)에 좌표 넣기 -> 해당 좌표에 map배열에 gNum 입력과 방문체크 후 BFS() 실행 ★★★ 여기서 섬들의 좌표가 잘 찍혔는지 map을 print 해서 디버깅 한번 해보기!!! 3. 반복문을 사용해 섬번호 1번부터 끝번호까지 탐색 -> check배열 초기화 -> func(섬번호) 함수 실행 4. func(섬번호) 함수 -> arr 맵을 돌며 섬번호와 같은 좌표는 q2( y좌표, x좌표, cnt(초기값0) ) 삽입 -> q2에 대한 bfs 실시 -> 만약 다음 노드가 방문하지 않은 곳이고, 맵에서 0 .. 2020. 2. 26.
[ 백준 1926 ] 그림 (C++) [문제보기] [해결과정] 1. input -> n, m (세로, 가로) 변수, arr (map 2차원 배열) 2. arr 맵을 돌며, arr[i][j]==1 이고, check[i][j]==0 (방문하지않음) 이라면, 진입 -> group(집합 갯수)를 +1 시키고, cnt(원소 갯수)를 1로 초기화한다. -> ★★★그리고 만약 maxCnt(최대 원소 갯수) 보다 cnt가 크면 maxCnt == cnt; -> check[i][j]==1로 방문체크를 한다. -> queue에 i,j좌표를 삽입하고, BFS()로 진입한다. 3. BFS -> 주변 4방향을 탐색하며, arr[i][j]==1이고, check[i][j]==0 인 곳 진입 -> cnt(원소 갯수)++; -> 그리고 만약 maxCnt(최대 원소 갯수) .. 2020. 2. 24.
[ 백준 17472 ] 다리 만들기2 (C++) [문제보기] [해결과정] 1. 입력 받기 (n, m, arr[][]) 2. 섬 번호 메기기 -> gNum 변수 선언 (섬 번호 Count) -> arr 배열을 돌면서, 1이면서 방문하지 않은 곳이라면 q(큐)에 좌표 넣기 -> bq(또 다른 큐)는 추후 해당 좌표가 다른 섬이랑 연결 될 수 있는지 확인 하기 위한 것 -> 해당 좌표에 map배열에 gNum 입력과 방문체크 후 BFS() 실행 -> 해당 좌표에서 상,하,좌,우에 1이 있다면 방문체크 후, q(큐), bq(큐)에 넣기. -> 다음 좌표의 map에는 gNum(섬 번호) 입력. ★★★ 여기서 섬들의 좌표가 잘 찍혔는지 map을 print 해서 디버깅 한번 해보기!!! 3. 2번 과정에서 bq(큐)에 넣은 값들을 하나씩 꺼내보며, 다른 섬으로 갈 .. 2020. 2. 22.
[ 백준 17822 ] 원판 돌리기 (C++) [문제보기] [해결과정] 1. deque 2차원 배열 생성. 2. deque에 값 넣기. 3. 문제 입력 받기 (돌릴 내용) 4. turn 함수 실행 전, x의 배수 만큼 돌릴 수 있도록 반복문 설정 후 turn 진입 - 만약 시계 방향이라면, 뒤에 것을 앞으로... - 만약 반시계 방향이라면, 앞에 것을 뒤로... 5. 같은 숫자 지우기 - 절대값으로 비교 ! 좌우, 앞뒤, *** 가장 중요한 맨앞, 맨뒤 *** ---> 같은 수라면 음수로 설정 - 절대값으로 비교하는 이유 : 이미 발견된 수가 있을 수 있으므로... - 만약 같은 숫자를 단 한번이라도 지운 적이 있다면 flag 변수 설정 - 모든 작업 후에, 음수인 숫자를 0으로 변경 6. 만약 같은 숫자가 하나도 없었더라면, - deque에 있는 .. 2020. 2. 19.