import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] str = {"30", "20", "10" };
// 내림차순
Arrays.sort(str, new Comparator<String>(){
public int compare(String a, String b) {
return (b + a).compareTo(a + b);
}
});
for (String x : str) {
System.out.print(x + " ");
}
// 오름차순
System.out.println();
Arrays.sort(str, new Comparator<String>() {
public int compare(String a, String b) {
return (a + b).compareTo(b + a);
}
});
for (String x : str) {
System.out.print(x + " ");
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, answer = 0;
static boolean[] visited;
static boolean[][] graph;
public static void dfs(int idx) {
visited[idx] = true;
for (int i = 1; i <= N; i++) {
if (graph[idx][i] && !visited[i]) {
dfs(i);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new boolean[N + 1][N + 1];
visited = new boolean[N + 1];
for (int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
graph[u][v] = true;
graph[v][u] = true;
}
for (int j = 1; j <= N; j++) {
if(!visited[j]) {
dfs(j);
answer++;
}
}
System.out.print(answer);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N, M, V;
static boolean[] visited;
static boolean[][] graph;
static StringBuilder sb = new StringBuilder();
static Queue<Integer> q = new LinkedList<>();
public static void bfs(int start) {
q.add(start);
visited[start] = true;
while (!q.isEmpty()) {
start = q.poll();
sb.append(start).append(" ");
for (int i = 1; i <= N; i++) {
if (graph[start][i] && !visited[i]) {
q.add(i);
visited[i] = true;
}
}
}
}
public static void dfs(int start) {
visited[start] = true;
sb.append(start).append(" ");
for (int i = 1; i <= N; i++) {
if(graph[start][i] && !visited[i]) {
dfs(i);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 1. 입력 먼저
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
visited = new boolean[N + 10];
graph = new boolean[N + 10][N + 10];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
graph[y][x] = true;
graph[x][y] = true;
}
dfs(V);
System.out.println(sb.toString());
sb = new StringBuilder();
visited = new boolean[N + 10];
bfs(V);
System.out.println(sb.toString());
}
}
Level Goal The password for the next level is stored somewhere on the server and has all of the following properties:
owned by user bandit7 owned by group bandit6 33 bytes in size
Commands you may need to solve this level ls , cd , cat , file , du , find , grep
find : 파일 시스템에서 명령을 사용하여 디렉토리 트리에서 지정된 각 경로를 반복적으로 검색하여 다음 텍스트에 제공된 용어를 사용하여 작성된 부울 표현식과 일치하는 파일을 찾습니다.
문제 해석
서버 어딘가에 다음과 같은 항목을 만족하는 곳에 비밀번호가 저장되어 있다
owned by user bandit7 owned by group bandit6 33 bytes in size
bandit6@bandit:~$ ls
bandit6@bandit:~$ cd /
bandit6@bandit:/$ ls
bin formulaone lib.usr-is-merged proc srv
bin.usr-is-merged home libx32 root sys
boot krypton lost+found run tmp
dev lib media sbin usr
drifter lib32 mnt sbin.usr-is-merged var
etc lib64 opt snap
우선, 홈 디렉터리(~)에서 ls 명령어를 통해 파일이나 디렉터리가 없음을 확인했다
(al하면 몇 개 나오지만, 문제와는 상관없음)
그래서 최상위 디렉토리(/)로 접근하여 ls 명령을 수행하니 여러 파일이 나오는 것을 알 수 있다.
문제에서 stored somewhere라고, 어디인지 구체적인 말을 안해주었기에 최사위 디렉터리에서 접근하는 것이 좋을 것 같다.
주어진 조건을 만족하는 파일을 찾기위해 find 명령어를 사용하자
bandit6@bandit:/$ find . -user bandit7 -group bandit6 -size 33c
find: ‘./sys/kernel/tracing’: Permission denied
find: ‘./sys/kernel/debug’: Permission denied
find: ‘./sys/fs/pstore’: Permission denied
find: ‘./sys/fs/bpf’: Permission denied
find: ‘./snap’: Permission denied
find: ‘./run/lock/lvm’: Permission denied
find: ‘./run/systemd/inaccessible/dir’: Permission denied
find: ‘./run/systemd/propagate/systemd-udevd.service’: Permission denied
....
해당 오류를 자세히 보면 Permission denied가 공통적으로 나옴
Permission denied라는 에러를 포함한 응답을 휴지통에 넣으면 정답을 찾을 수 있을 것 같다.
그런데 리눅스에서 휴지통은 어디에 있고, Permission denied라는 에러를 어떻게 집어넣을 수 있을까?
그 전에, 표준 입출력에 대한 내용을 잠시 살펴보자
표준 입력(Standard Input Stream ; 0) : 쉘에 명령어, 데이터를 입력하는 것
표준 출력(Standard Output Stream ; 1) : 프로ㅡ램의 실행 결과를 쉘 화면에 보여주는 것
표준 에러(Standard Error Stream ; 2) : 사용자 요청을 반환할 수 없을 때 에러
0, 1, 2는 File Descriptor라는 값이다.
이 File Descriptor라는 것을 이용하여, 리눅스의 휴지통 역할을 하는 /dev/null에 Permission denied 오류를 집어넣는다
Level Goal The password for the next level is stored in the only human-readable file in the inhere directory. Tip: if your terminal is messed up, try the “reset” command.
Commands you may need to solve this level ls , cd , cat , file , du , find
패스워드는 inhere directory안에 오직 인간만이 읽을 수 있는 파일에 있다. 화면이 좀 지저분하면, reset을 추천한다.
bandit4@bandit:~$ ls
inhere
bandit4@bandit:~$ file inhere
inhere: directory
bandit4@bandit:~$ cd inhere
bandit4@bandit:~/inhere$ ^C
bandit4@bandit:~/inhere$ ls
-file00 -file01 -file02 -file03 -file04 -file05 -file06 -file07 -file08 -file09
우선 inhere directory로 경로를 이동한다.
그리고, inhere idrectory에 -file00 ~ file09까지의 여러 파일이 있다
자, 여기서 "나는 저 파일을 다 확인하면 되겠는데?"라고 생각하는 분이 있다면, 한 손을 들어올려 자신의 뺨을 쳐주세ㅇ...
본인 이야기다.
우리는 해커가 될 거니까, 좀 더 인텔리한 방법을 찾아보자
bandit4@bandit:~/inhere$ file -file00
file: Cannot open `ile00' (No such file or directory)
문제에서 the only human-readable file라는 문구가 있어서 file 명령어로 파일의 형태를 알아본다.
그러나, -file00은 -가 선두에 오는데, 이 경우에는 상대경로를 활용하여 확인할 수 있다
bandit4@bandit:~/inhere$ file ./-file00
./-file00: data
bandit4@bandit:~/inhere$ file ./-file01
./-file01: data
bandit4@bandit:~/inhere$ file ./-file02
./-file02: data
이렇게 -file00 부터 -file09까지 확인할 수 있지만, 우리는 해커다.
조금 더 편하게 보기 위해 와일드카드를 활용하자
bandit4@bandit:~/inhere$ file ./*
./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: data
./-file07: ASCII text
./-file08: data
./-file09: data
-file07은 파일 형태가 ASCII text로 되어있다. 즉, the only-human readable file에 적합한 상태이다.
Level Goal The password for the next level is stored in a file called spaces in this filename located in the home directory
Commands you may need to solve this level ls , cd , cat , file , du , find
Helpful Reading Material Google Search for “spaces in filename”
문제 해석
home directory 안에 spaces in this filename라는 파일에 패스워드가 있다.
일단 pwd, ls 명령어로 home directory의 spaces in this file name이라는 파일 존재를 확인하자.
bandit2@bandit:~$ pwd
/home/bandit2
bandit2@bandit:~$ ls
spaces in this filename
자, 그럼 여태껏 그래왔듯이 cat 명령어를 사용하여 파일을 출력하자
bandit2@bandit:~$ cat spaces in this filename
cat: spaces: No such file or directory
cat: in: No such file or directory
cat: this: No such file or directory
cat: filename: No such file or directory
파일에 공백이 있으면, 명령어에 파일명을 입력할 때 파일명이 명령어의 전달 인자로서 인식할 수 있다.
그래서 왠만하면 공백을 피하는 게 좋은데, 공백이 씌여진 파일은 큰 따옴표나 tab으로서 읽을 수 있다.
bandit2@bandit:~$ cat spaces\ in\ this\ filename
MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx
tab을 누른 경우
bandit2@bandit:~$ cat "spaces in this filename"
MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx
큰 따옴표를 사용하여 출력한 경우