티스토리 뷰
목차
1. 마법의 엘리베이터
👉 소스코드
public int solution(int storey) {
int answer = 0;
int nextCnt = 0;
int flag = 0;
if(storey <= 5) return storey;
while(storey != 0) {
if(storey % 10 == 5) {
answer += 5;
// 그다음 자리수가 5보다 큰지 확인
int tmp = storey;
tmp /= 10;
if(tmp % 10 >= 5 && tmp > 50) {
nextCnt = 1;
}
}
if(storey % 10 < 5) {
answer += storey % 10;
}
if(storey % 10 > 5) {
answer += 10 - (storey % 10);
flag = 1;
}
storey /= 10;
// 5일때 다음 자리수 값
if(nextCnt == 1) {
storey += 1;
nextCnt = 0;
}
// 5보다 큰수일때 그 다음 자리수
if(flag == 1) {
storey += 1;
flag = 0;
}
}
return answer;
}
2. 테이블 해시 함수
👉 소스코드
public int solution(int[][] data, int col, int row_begin, int row_end) {
int answer = 0;
// col번째 값을 기준으로 오름차순 정렬 -> 값이 같으면 0번째 값을 기준으로 내림차순 정렬
for (int i = 0; i < data.length; i++) {
for (int j = i + 1; j < data.length; j++) {
if (data[i][col - 1] == data[j][col - 1]) {
if (data[i][0] < data[j][0]) {
int[] tmp = data[j];
data[j] = data[i];
data[i] = tmp;
}
}else if(data[i][col - 1] > data[j][col - 1]) {
int[] tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
}
}
// row_begin, row_end값 합
for(int i = row_begin - 1 ; i < row_end; i++) {
int sum = 0;
for(int column : data[i]) sum += (column % (i + 1));
answer ^= sum;
}
return answer;
}
3. 롤케이크 자르기
👉 소스코드
public int solution(int[] topping) {
int answer = 0;
HashSet<Integer> left = new HashSet<Integer>();
HashMap<Integer, Integer> right = new HashMap<Integer, Integer>();
left.add(topping[0]);
for(int i = 1; i < topping.length; i++) {
right.put(topping[i], right.getOrDefault(topping[i], 0) + 1);
}
for(int i = 1; i < topping.length; i++) {
left.add(topping[i]);
right.put(topping[i], right.get(topping[i]) - 1);
if(right.get(topping[i]) == 0) {
right.remove(topping[i]);
}
if(left.size() == right.size()) answer++;
}
return answer;
}
- HashMap에 각 숫자들의 개수를 mapping 한 뒤, Set에 담아가면서 사이즈가 같은지 확인하는 아이디어 이 마저도 처음에 풀지 못하여 다른 사람의 풀이를 보고 이해한 후 풀이를 진행하였다.
4. 혼자 놀기의 달인
👉 소스코드
public int solution(int[] cards) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < cards.length; i++) {
int cnt = 0;
int k = i;
while (true) {
if (cards[k] != -1) {
int tmp = cards[k] - 1;
cards[k] = -1;
k = tmp;
cnt++;
} else {
list.add(cnt);
break;
}
}
}
list.sort(Collections.reverseOrder());
return list.get(0) * list.get(1);
}
- 방문한 자리는 -1로 바꿔주고 그 다음 방문할 인덱스가 -1이라면 그룹 상자가 다 만들어졌다고 판단.
만들어진 그룹 상자의 length는 count변수로 체크하고 list에 add
5. k진수에서 소수 개수 구하기
👉 소스코드
public int solution(int n, int k) {
int answer = 0;
String str = Integer.toString(n, k);
str = str.replaceAll("101 | 0", " ").replaceAll("0", " ").replaceAll("\\s+", " ").trim();
String[] array = str.split(" ");
for(int i=0;i<array.length;i++){
BigInteger b1 = new BigInteger(array[i]);
if(b1.isProbablePrime(10)) ++answer;
}
return answer;
}
6. 모음사전
👉 소스코드
public int solution(String word) {
int answer = 0;
int[] cha = {781, 156, 31, 6, 1};
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("A", 0);
map.put("E", 1);
map.put("I", 2);
map.put("O", 3);
map.put("U", 4);
String[] wordArr = word.split("");
answer += wordArr.length;
for(int i = 0; i < wordArr.length; i++) {
answer += cha[i] * map.get(wordArr[i]);
}
return answer;
}
- 각 자리에 필요한 수를 파악하는 것이 순서였습니다. 각 자리에 필요한 수는 전번 자리수 * 5 + 1 공식이 성립됩니다.
6. 무인도 여행
👉 소스코드
import java.util.*;
class Solution {
static int num = 0;
static boolean[][] visited;
static int[] moveX = {0, 0, -1, 1};
static int[] moveY = {-1, 1, 0, 0};
static char[][] ch;
static ArrayList<Integer> list = new ArrayList<Integer>();
public int[] solution(String[] maps) {
ch = new char[maps.length][maps[0].length()];
visited = new boolean[maps.length][maps[0].length()];
for(int i = 0; i < ch.length; i++) {
ch[i] = maps[i].toCharArray();
}
for(int i = 0; i < ch.length; i++) {
for(int j = 0; j < ch[i].length; j++) {
if(ch[i][j] != 'X') {
num = 0;
if(!visited[i][j]) {
num = Character.getNumericValue(ch[i][j]);
bfs(i, j, num);
}
if(num != 0) {
list.add(num);
}
}
}
}
int[] answer = new int[list.size()];
if(list.isEmpty()) {
answer = new int[1];
answer[0] = -1;
}else {
Collections.sort(list);
for(int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
}
return answer;
}
public static void bfs(int x, int y, int cnt) {
Queue<int[]> q = new LinkedList<int[]>();
q.offer(new int[]{x, y});
visited[x][y] = true;
while(!q.isEmpty()) {
int curX = q.peek()[0];
int curY = q.peek()[1];
q.poll();
for(int i = 0; i < 4; i++) {
int nextX = curX + moveX[i];
int nextY = curY + moveY[i];
if(nextX < 0 || nextY < 0 || nextX >= ch.length || nextY >= ch[0].length || visited[nextX][nextY]) continue;
if(ch[nextX][nextY] != 'X') {
q.offer(new int[] {nextX, nextY});
visited[nextX][nextY] = true;
cnt += Character.getNumericValue(ch[nextX][nextY]);
}
}
num = cnt;
}
}
}
- bfs를 활용한 풀이