본문 바로가기

Algorithm

(117)
[백준] Python - 10971.외판원순회2 생각 각 도시마다 간선별 비용이 다를수있으므로 도시별로 방문 순서가 다르면 비용이 다릅니다. 따라서 이를 순서의 다름이 의미의 다름을 뜻하는 순열로 생각하고 문제를 풀었습니다. i->j 로 가는 도시의 비용을 저장하는 2차원 배열을 만들어 입력을 통해 모두 저장해줍니다. 방문체크를 위해 N개의 도시의 방문여부를 False로초기화시켜줍니다. 도시의 방문 순서를 만들어주는 dfs 함수입니다. 다음노드를 방문할수있는 상태(0보다 큰값을 가지는 노드)이고 방문하지 않았다면 방문 체크를 True로 만들어주고 다음 단계로 들어갑니다. 이때 비용은 현재 비용에서 다음방문 비용을 더해줘야합니다. 현재노드에서 뒤로 나열할수있는 모든 도시를 정했으므로 다음 노드의 순열을 만들기위해 방문 체크를 False로 갱신합니다. 모..
[백준] JAVA - 16926. 배열 돌리기 1 2차원 배열이 주어졌을때 배열을 R번 회전시킨 결과를 출력하는 문제입니다. 알고리즘 분류에는 구현이라고 정의되어있지만 요즘 재귀,DFS 문제를 계속 연습하는 중이라 이 문제도 재귀적으로 풀어보고 싶어서 도전했습니다! 1. 배열을 회전시킬 껍데기 개수를 구한다. 오른쪽 -> 위 -> 왼쪽 static int[] dx = {0,1,0,-1}; // 아래 -> 오른쪽 -> 위 -> 왼쪽 public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new Str..
[SWEA] JAVA - 1233. 사칙연산유효성검사 노드는 숫자이거나 연산자인 두 가지 경우가 있다. 만약 노드가 연산자일때 유효한 경우는 왼쪽자식 연산자 + 오른쪽자식 연산자 왼쪽자식 연산자 + 오른쪽자식 숫자 왼쪽자식 숫자 + 오른쪽자식 숫자 노드가 숫자일때 유효한 경우는 자식이 있으면 안됀다 (리프 노드여야 한다.) package com.ssafy.off; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class SWEA_1233_사칙연산유효성검사 { /** * 노드 개수 - N * 각줄마다 노드번호, 왼쪽자식 노드번호, 오른쪽자식 노드번호 * 경현님 코드 보고 이해했습니다 ㅠㅠ */ static String[] tre..
[백준] JAVA - 2563 색종이 모눈종이에 1*1 영역을 한칸씩(각 영역에 점을 찍는다라고 생각) 색칠한다고 생각하고 문제를 풀었습니다. 주어진 x,y 좌표에서 10씩 더한다음 그 영역에 1 표시가 되어있지 않다면 정답을 1씩 증가시켜줍니다. package com.ssafy.off; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Baekjoon_2563_색종이 { static int[][] map = new int[101][101]; static int cnt; public static void main(String[] args) throws NumberFormatException, IOExce..
[SWEA] JAVA - 1974. 스도쿠 검증 9*9 표에 가로방향, 세로방향, 각 영역별로 1부터 9까지 채워져있는지를 체크하는 문제입니다. 스도쿠 게임을 할 때 가로방향 합, 세로방향 합, 내부 영역의 합이 모두 45일때가 올바른 스도쿠 입니다. 1. 각 영역의 왼쪽상단 y좌표, x좌표를 받아 가로방향과 세로방향 내부 영역의 합이 모두 45인지를 체크하는 함수를 만들었습니다. 2. 위의 3가지 경우를 모두 만족했을때 true를 리턴합니다. 그렇지 않다면 false를 리턴합니다. 3. main 함수에서 이중 포문을 돌며 y좌표,x좌표를 3씩 증가시킵니다. 이때의 좌표값이 각 영역의 시작 좌표이므로 solve 함수의 파라미터로 넣어 확인합니다. package com.ssafy.makeupclass; import java.io.BufferedReade..
[백준] JAVA - 1158.요세푸스 문제 N명이 모두 제거될때까지 계속 순열을 돌아가면서 K번째 사람을 제거하는 문제입니다. 1. K번째를 원순열에서 지워줘야하기 때문에 현재까지 지나온 횟수인 (cnt % K) 연산을 사용해서 K번째 인지를 체크합니다. 2. K번째 사람이라면 큐에서 pop을 해주고 결과값에 추가해줍니다. 3. K번째 사람이 아니라면 큐의 맨 앞 원소를 큐의 맨 뒤에다가 넣어줍니다. 4. 큐가 다 빌때까지 이 과정을 반복합니다. 마지막으로 결과를 출력할때 정해진 출력 형식이 있기 때문에 마지막 문자열에서 sb.deleteCharAt(sb.lastIndexOf(",")) 를 사용하여 ',' 와 공백을 제거해줬습니다. Java 코드 package com.ssafy.off; import java.io.BufferedReader; im..
[SWEA] JAVA - 9229. 한빈이와 Spot Mart 재귀 연습을 위해 재귀함수를 사용하여 풀었습니다ㅎㅎ 각각 다른 과자 두봉지를 살때 얻을수있는 최대 무게 합을 구하는 문제입니다. 우선 solve 함수에서 변화하는 값들을 파라미터로 설정했습니다. idx는 현재 뽑으려는 과자의 인덱스 번호입니다. cnt는 현재까지 뽑은 과자의 개수, weight 는 현재까지 뽑은 과자 무게의 총 합입니다. 제가 정의한 solve 재귀 함수의 역할은 idx번째 과자까지 뽑든 안뽑든 지나쳐왔으며 현재까지 뽑은 과자의 개수를 담고있고, 현재까지 뽑은 과자의 무게를 가지고 있습니다. 재귀 함수의 동작 방식은 다음과 같습니다. 1. 뽑은 과자의 총 개수가 두개일때 현재 가지고 있는 무게의 합을 리턴합니다. 2. 뽑은 과자의 개수가 두개가 안되는데 (최대 무게를 초과해 뽑지 못한상태..
[SWEA] JAVA - 1940. 가랏! RC카! 오늘 배운것 : Java에서 switch문은 내부적으로 hash로 구현되어있기 때문에 switch가 if else 보다 월등히 빠르다. 자동차의 현재 속도와 자동차의 총 이동거리를 누적한 변수들을 설정하여 이동거리 += (속도*1초) 로 풀었습니다. 여기서 현재속도 v보다 감속하는 속도가 더 클 경우에는 현재속도를 0으로 업데이트 시켜야 합니다. 가속명령어가 들어왔을 경우 현재속도에 가속된 값을 더해줘야 합니다. 마지막으로 for문이 한번돌때마다 1초가 반영됐기 때문에 (자동차의 누적 이동 거리 += 자동차의 현재속도) 연산을 해주면 됩니다. package com.ssafy.makeupclass; import java.io.BufferedReader; import java.io.IOException; i..