티스토리 뷰
목차
안녕하세요
원하는 회사에 입사하기 위해서는 알고리즘 공부가 필요하다는 걸 알면서도 마냥 두렵기만 해서 차일피일 미루기만 했었는데요
이제는 피할 수만은 없다는 생각이 들어서 공부를 시작하게 되었습니다.
공부를 하게 된 계기는 어느 개발자분의 블로그에 알고리즘 공부는 필수다라는 주제로 포스팅 되어 있는 글을 보면서 알고리즘 공부를 실천하게 되었습니다.
해당 글에서는 알고리즘 공부의 필요성, 효과적인 공부방법 등 여러가지 주제의 글들이 있었는데 읽는 내내 제 자신에게 따끔한 채찍과, 공부를 하게 해줄 용기를 북돋아 주었습니다.
공부를 시작하기에 앞서 공부를 하게 만드는 룰을 정해놓고 시작하자라고 생각했는데
더도 말고 덜도 말고 딱 하루에 한 문제만 풀자고 스스로 분량을 정했고 풀이한 문제와 답은 꼭 블로그에 올리기로 결심했습니다.
분량이 적어 보인다고 하실 수도 있는데 욕심부려서 분량을 많이 정해놓고 시작하면 되래 쉽게 지칠까봐 정말 할 수 있는 양을 생각하여 결정하였습니다.
빗방울이 바위를 뚫음은 강인함이 아니라 꾸준함이라고 했습니다. (수적석천/水滴石穿)) 제 자신을 빗방울이라고 생각하고 한번 꾸준히 바위를 뚫어보려고 합니다.!
제 실력이 Level 0도 간당간당한 실력이라서 아직은 고난이도에 문제는 생각도 못하는 수준입니다..
단계를 올라가면서 포스팅을 나눠 할 생각이고 낮은 단계의 문제들은 한꺼번에 포스팅 할 계획입니다.
오늘 첫 번째로 풀은 문제를 시작으로 해서 꾸준히 포스팅 하도록 하겠습니다!
1. 잘라서 배열로 저장하기
👉 소스코드
public static String[] solution(String my_str, int n) {
int index = my_str.length() % n == 0 ? my_str.length() / n : my_str.length() / n + 1;
String[] answer = new String[index];
int cnt = 0;
for (int i = 0; i <= answer.length - 1; i++) {
if (i != answer.length - 1) {
answer[i] = my_str.substring(cnt, cnt + n);
cnt += n;
} else if (i == answer.length - 1) {
answer[i] = my_str.substring(cnt);
}
}
return answer;
}
- 인자로 받은 n을 이용해서 카운팅 하느라 쓸데없이 시간을 낭비했습니다.
카운팅 할 변수를 따로 선언하고 cnt 변수를 가지고 index 삼아 활용하니 간단한 문제였습니다.
하지만 문제를 풀고 다른 사람들의 코드를 보고 좌절했습니다,,
저도 어서 클린 코드를 구사하고 싶다는 생각이 제 머릿속을 가득 매웠습니다
2. 7의 개수
👉 소스코드
public static int solution(int[] array) {
int answer = 0;
String[] strArray = new String[array.length];
for(int i = 0 ; i < strArray.length; i++) {
strArray[i] = String.valueOf(array[i]);
}
String intStr = "";
for(int i = 0; i < strArray.length; i++) {
intStr += strArray[i].replaceAll("[^7]", "");
}
answer = intStr.length();
return answer;
}
- 나머지 연산자를 이용하면 쉽게 풀 수 있을거 같았는데 도저히 생각나지 않아서 그냥 문자열로 변환한 뒤, 7만 잘라서 스트링에 이어붙혀서 해결했다.
3. 문자열 정렬하기(2)
👉 소스코드
public static String solution(String my_string) {
String[] strArray = my_string.split("");
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
String answer = "";
for (int i = 0; i < strArray.length; i++) {
answer += strArray[i].toLowerCase();
}
System.out.println(answer);
return answer;
}
- for문을 돌리지 않고 풀고 싶었는데 for문을 돌리고야 말았다,, 소문자로 먼저 변경해서 비교하면 됐었던 문제였다
4. 세균 증식
👉 소스코드
public static int solution(int n, int t) {
return (int) Math.pow(2, t) * n;
}
5. 제곱수 판별하기
👉 소스코드
public static int solution(int n) {
int tmp = (int) Math.sqrt(n);
return tmp * tmp == n ? 1 : 2;
}
6. 문자열안에 문자열
👉 소스코드
public static int solution(String str1, String str2) {
return str1.contains(str2) ? 1 : 2;
}
7. OX퀴즈
👉 소스코드
public static String[] solution(String[] quiz) {
String[] answer = new String[quiz.length];
String[] tmp = new String[quiz.length];
for (int i = 0; i < quiz.length; i++) {
tmp = quiz[i].split(" ");
if (tmp[1].equals("-")) {
if (Integer.parseInt(tmp[0]) - Integer.parseInt(tmp[2]) == Integer.parseInt(tmp[4])) {
answer[i] = "O";
} else {
answer[i] = "X";
}
}
if (tmp[1].equals("+")) {
if (Integer.parseInt(tmp[0]) + Integer.parseInt(tmp[2]) == Integer.parseInt(tmp[4])) {
answer[i] = "O";
} else {
answer[i] = "X";
}
}
}
return answer;
}
- 문제를 어렵사리 풀어보고 타인의 코드를 보니 실제로 형변환을 해서 값을 비교했으면 코드를 좀 더 줄일 수 있었다.
8. 자릿수 더하기
👉 소스코드
public int solution(int n) {
int answer = 0;
char[] tmp = String.valueOf(n).toCharArray();
for (int i = 0; i < tmp.length; i++) {
answer += Character.getNumericValue(tmp[i]);
}
return answer;
}
9. n의 배수 고르기
👉 소스코드
public int[] solution(int n, int[] numlist) {
int[] array = new int[numlist.length];
int cnt = 0;
for (int i = 0; i < numlist.length; i++) {
if (numlist[i] % n == 0) {
array[cnt] = numlist[i];
cnt++;
}
}
int[] answer = new int[cnt];
for (int i = 0; i < cnt; i++) {
answer[i] = array[i];
}
return answer;
}
- 배열은 추가, 삭제 개념이 없다. 다른 방법으로도 풀 수 있지만 간단하게 배열 두개를 이용해서 출력 값을 삭제한 것처럼 보여주면 되는 문제
10. 숫자 찾기
👉 소스코드
public int solution(int num, int k) {
int answer = 0;
boolean flag = false;
String[] tmp = Integer.toString(num).split("");
String s = Integer.toString(k);
for (String string : tmp) {
answer++;
if (string.equals(s)) {
flag = true;
break;
}
}
if (flag == false)
answer = -1;
return answer;
}
11. 배열의 유사도
👉 소스코드
public int solution(String[] s1, String[] s2) {
int answer = 0;
for (int i = 0; i < s1.length; i++) {
for (int j = 0; j < s2.length; j++) {
if (s1[i].equals(s2[j])) {
answer++;
}
}
}
return answer;
}
12. 문자열 계산하기
👉 소스코드
public int solution(String my_string) {
String[] tmp = my_string.split(" ");
int answer = Integer.parseInt(tmp[0]);
for (int i = 0; i < tmp.length; i++) {
if (i % 2 != 0) {
if (tmp[i].equals("+")) {
answer += Integer.parseInt(tmp[i+1]);
} else {
answer -= Integer.parseInt(tmp[i+1]);
}
}
}
return answer;
}
13. 가장 큰 수 찾기
👉 소스코드
public int[] solution(int[] array) {
int[] answer = new int[2];
for (int i = 0; i < array.length - 1; i++) {
if (array[i] < array[i + 1]) {
answer[0] = array[i + 1];
answer[1] = i + 1;
}
}
return answer;
}
14. 편지
👉 소스코드
public int solution(String message) {
return message.length() * 2;
}
15. 약수 구하기
👉 소스코드
public int[] solution(int n) {
int cnt = 0;
int[] tmp = new int[n];
for (int i = 1; i < n; i++) {
if ((n / i) * i == n) {
tmp[cnt] = i;
cnt++;
}
}
cnt++;
tmp[cnt - 1] = n;
int[] answer = new int[cnt];
for (int i = 0; i < answer.length; i++) {
answer[i] = tmp[i];
}
return answer;
}
16. 한 번만 등장한 문자
👉 소스코드
public String solution(String s) {
String answer = "";
String res = "";
String[] tmp = s.split("");
String[] result = new String[res.length()];
for (int i = 0; i < tmp.length; i++) {
if (!res.contains(tmp[i])) {
res += tmp[i];
}
}
for (int i = 0; i < res.length(); i++) {
if (s.indexOf(res.charAt(i)) == s.lastIndexOf(res.charAt(i))) {
answer += res.charAt(i);
}
}
char[] lastTemp = answer.toCharArray();
for (int i = 0; i < answer.length(); i++) {
for (int j = 0; j < answer.length(); j++) {
if (lastTemp[i] < lastTemp[j]) {
char x = lastTemp[i];
lastTemp[i] = lastTemp[j];
lastTemp[j] = x;
}
}
}
String lastResult = new String(lastTemp);
return lastResult;
}
- 문자열과 배열만을 이용해서 풀이하려다보니 쓸데없이 코드가 길어지고 시간이 오래걸렸다. 난이도가 조금씩 올라갈수록 기존에 활용하던 자료형으로는 풀이하는데 한계가 있으니 ArrayList를 활용해야겠다.
17. 인덱스 바꾸기
👉 소스코드
public String solution(String my_string, int num1, int num2) {
char[] temp = my_string.toCharArray();
char[] res = new char[temp.length];
for (int i = 0; i < temp.length; i++) {
res[i] = temp[i];
if (i == num1)
res[num1] = temp[num2];
if (i == num2)
res[num2] = temp[num1];
}
String answer = new String(res);
return answer;
}