오늘의 계획
1. 코드 공부
내용
어제에 이어... 컨트롤러의 for문과 뷰의 forEach문을 빼고 고쳐봤으나 이번에는 not null조건을 위반했다고 뜬다...
아니 그렇다고 강의 계획서를 다시 다 적는다??? 이게 더 이상함;;
다시 도돌이표... forEach문을 쓰는게 최선인걸 아는데 중복데이터로 들어가는게 ㄹㅇ 문제라 이거지 아오
결국 forEach문으로 다시 돌아가고 말았다...ㅋㅋ큐ㅠㅠㅠㅠㅠ 내일 다른 방법을 다시 찾아보기로
2. 프로그래머스 코딩 테스트
문제1.
정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.
제한사항:
- 2 ≤ num_list의 길이 ≤ 10
- 1 ≤ num_list의 원소 ≤ 9
입출력 예
num_list | result |
[2, 1, 6] | [2, 1, 6, 5] |
[5, 2, 1, 7, 5] | [5, 2, 1, 7, 5, 10] |
- 입출력 예 #1: 마지막 원소인 6이 그전 원소인 1보다 크기 때문에 6 - 1인 5를 추가해 return합니다.
- 입출력 예 #2: 마지막 원소인 5가 그전 원소인 7보다 크지 않기 때문에 5의 두 배인 10을 추가해 return합니다.
class Solution {
public int[] solution(int[] num_list) {
int[] answer = {};
return answer;
}
}
풀이과정
: for문과 if문을 둘 다 써야할듯 싶다. 그리고 마지막 원소와 그 전 원소를 선언해야할듯..?
class Solution {
public int[] solution(int[] num_list) {
int[] answer = {};
// 추가한 값 answer
answer = new int[num_list.length + 1];
// 마지막 원소 last
int last = new int[num_list.length - 1];;
// 마지막 원소의 전 원소 laLast
int laLast = new int[num_list.length - 2];;
for (int i = 0; i < num_list.length; i++) {
if (last > laLast) {
answer = last - laLast;
} else {
answer = last * 2;
}
}
return answer;
}
}
이렇게 했는데 new 선언부분과 연산기호가 틀렸다고 떴다. 처음에 new 선언한 부분을 복붙했더니 last와 laLast부분도 잘못 선언된것 때문인듯. 세미콜론도 두개나..ㅋㅋㅋㅋ
class Solution {
public int[] solution(int[] num_list) {
int[] answer = {};
// 추가한 값 answer
answer = new int[num_list.length + 1];
// 마지막 원소 last
int last = num_list[num_list.length - 1];
// 마지막 원소의 전 원소 laLast
int laLast = num_list[num_list.length - 2];
for (int i = 0; i < num_list.length; i++) {
if (last > laLast) {
answer = last - laLast;
} else {
answer = last * 2;
}
answer[i] = num_list[i];
}
return answer;
}
}
근데 여기서도 연관기호때문에 틀린다고 떴다...
class Solution {
public int[] solution(int[] num_list) {
int[] answer = {};
// 추가한 값 answer
answer = new int[num_list.length + 1];
// 마지막 원소 last
int last = num_list[num_list.length - 1];
// 마지막 원소의 전 원소 laLast
int laLast = num_list[num_list.length - 2];
for (int i = 0; i < num_list.length; i++) {
answer[i] = num_list[i];
if (last > laLast) {
answer[i] = last - laLast;
} else {
answer[i] = last * 2;
}
}
return answer;
}
}
이걸로 고쳤는데 연산기호 문제는 사라졌지만, 실행한 결괏값이 기댓값과 다르다고 떴다. 내가 뭘 잘못했나...하고 다른사람들걸 찾아봤더니
정답
class Solution {
public int[] solution(int[] num_list) {
int[] answer = {};
// 추가한 값 answer
answer = new int[num_list.length + 1];
// 마지막 원소 last
int last = num_list[num_list.length - 1];
// 마지막 원소의 전 원소 laLast
int laLast = num_list[num_list.length - 2];
for (int i = 0; i < num_list.length; i++) {
answer[i] = num_list[i];
if (last > laLast) {
answer[num_list.length] = last - laLast;
} else {
answer[num_list.length] = last * 2;
}
}
return answer;
}
}
answer의 배열이 i가 아닌 num_list의 길이를 봤어야했다..ㅋㅋㅋ
배열은 너무 어려워...ㅠㅠㅠ
++ 다른사람의 풀이
class Solution {
public int[] solution(int[] num_list) {
int[] answer = new int[num_list.length+1];
for(int i = 0; i < num_list.length; i++) {
answer[i] = num_list[i];
}
int last = num_list[num_list.length-1];
int before = num_list[num_list.length-2];
answer[answer.length-1] = last > before ? last - before : last*2;
return answer;
}
}
내 풀이방식이랑 비슷하지만 더 간결해보인다. 삼항연산자...!
문제2.
정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
- "w": n이 1 커집니다.
- "s": n이 1 작아집니다.
- "d": n이 10 커집니다.
- "a": n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.
제한사항:
- - 100,000 ≤ n ≤ 100,000
- 1 ≤ control의 길이 ≤ 100,000 (control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.)
입출력 예
n | control | result |
0 | " wsdawsdassw" | -1 |
- 입출력 예 #1
- 수 n은 control에 따라 다음과 같은 순서로 변하게 됩니다.
- 0 → 1 → 0 → 10 → 0 → 1 → 0 → 10 → 0 → -1 → -2 → -1
- 따라서 -1을 return 합니다.
class Solution {
public int solution(int n, String control) {
int answer = 0;
return answer;
}
}
풀이과정
: 일단 여기까지 써두고... 문자를 따로 떼어내야 하나..? 그럼 charAt를 쓸까.. wasd는 if문을 쓰면 될것 같다
class Solution {
public int solution(int n, String control) {
int answer = 0;
for(int i = 0; i < control.length; i++) {
}
return answer;
}
}
class Solution {
public int solution(int n, String control) {
int answer = 0;
for(int i = 0; i < control.length(); i++) {
String value = "" + control.charAt(i);
if (value.equals("w")) {
answer += 1;
}else if (value.equals("s")) {
answer -= 1;
}else if (value.equals("d")) {
answer += 10;
}else if (value.equals("a")) {
answer -= 10;
}
}
return answer;
}
}
근데 이 코드가 테스트에서는 통과했는데 실행하니 틀렸다고 뜬다..! 아무리 해도 안되서 찾아보니
정답
class Solution {
public int solution(int n, String control) {
int answer = n;
for(int i = 0; i < control.length(); i++) {
String value = "" + control.charAt(i);
if (value.equals("w")) {
answer += 1;
}else if (value.equals("s")) {
answer -= 1;
}else if (value.equals("d")) {
answer += 10;
}else if (value.equals("a")) {
answer -= 10;
}
}
return answer;
}
}
answer 선언을 0이 아닌 n으로 하니까 됐다..ㅋㅋㅋㅋ
++ 다른사람의 풀이
문제3.
정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.
- "w": 수에 1을 더한다.
- "s": 수에 1을 뺀다.
- "d": 수에 10을 더한다.
- "a": 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.
주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
제한사항:
- 2 ≤ numLog의 길이 ≤ 100,000
- -100,000 ≤ numLog[0] ≤ 100,000
- 1 ≤ i ≤ numLog의 길이인 모든 i에 대해 |numLog[i] - numLog[i - 1]|의 값은 1 또는 10입니다.
입출력 예
numLog | result |
[0, 1, 0, 10, 0, 1, 0, 10, 0, -1, -2, -1] | " wsdawsdassw" |
- 입출력 예 #1: result인 "wsdawsdassw"를 따라 numLog[0]에서부터 시작해 조작을 하면 numLog의 값과 순서대로 일치합니다. 따라서 "wsdawsdassw"를 return 합니다.
- Hint: 수 조작하기 1" 문제의 n값이 numLog[0]에 해당하며, 이 문제에서 주어진 numLog에 따라 "수 조작하기 1" 문제의 control을 구하는 문제라고 이해할 수 있습니다.
입출력 예 #1은 "수 조작하기 1" 문제의 입출력 예 #1과 같은 예시이므로 참고하시기 바랍니다.
class Solution {
public String solution(int[] numLog) {
String answer = "";
return answer;
}
}
풀이과정
: 감이 안와서 찾아보니 StringBuilder를 많이 사용하더라. 이전부터 다른 사람의 코드를 보니 StringBuilder를 참 많이 쓰길래 이 기회에 얘가 뭔지 좀 적어놔야겠다 싶었다
StringBuilder
https://velog.io/@rara_kim/Java-StringBuilder-%EC%82%AC%EC%9A%A9%EB%B2%95
String 객체는 한번 생성되면 변경할 수 없지만, + 연산자를 사용하여 문자열을 열결할 수 있으나,연결할 때마다 새로운 문자열 객체가 생성되고 이전에 있던 문자열은 JVM의 GC가 처리하게 된다. 따라서 String 객체와 String 객체를 더하는 행위는 메모리 할당과 메모리 해제를 발생시켜, 연산이 많아진다면 성능상 좋지 않다.
이와같은 문제점을 해결하기 위해 StringBuilder가 등장하게 되었다.
StringBuilder는 String과 다르게 mutable한 성질을 가지고 있다. 즉, 값이 변할 수 있다.
StringBuilder는 문자열과 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적다.
따라서 긴 문자열을 더하는 상황이 발생할 경우 StringBuilder 혹은 StringBuffer를 사용하는 것이 좋다.
class Solution {
public String solution(int[] numLog) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numLog.length; i++) {
if (numLog[i] - numLog[i - 1] == 1) {
sb.append("w");
} else if (numLog[i] - numLog[i - 1] == -1) {
sb.append("s");
} else if (numLog[i] - numLog[i - 1] == 10) {
sb.append("d");
} else if (numLog[i] - numLog[i - 1] == -10) {
sb.append("a");
}
}
String answer = sb.toString();
return answer;
}
}
근데 아무리봐도 이거 맞는데 왜 안되지...???? 했는데 장난하나 import가 안된거였음ㅋㅋㅋㅋimport를 수동으로 쳐야해ㅋㅋㅋㅋㅋ
는 import를 넣어놔도 안되서 뭐지... 했는데 int i = 0;이 아니라 1이었다...아나
정답
import java.lang.StringBuilder;
class Solution {
public String solution(int[] numLog) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i < numLog.length; i++) {
if (numLog[i] - numLog[i - 1] == 1) {
sb.append("w");
} else if (numLog[i] - numLog[i - 1] == -1) {
sb.append("s");
} else if (numLog[i] - numLog[i - 1] == 10) {
sb.append("d");
} else if (numLog[i] - numLog[i - 1] == -10) {
sb.append("a");
}
}
String answer = sb.toString();
return answer;
}
}
++ 다른사람의 풀이
문제4.
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.
각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
제한사항:
- 1 ≤ arr의 길이 ≤ 1,000
- 0 ≤ arr의 원소 ≤ 1,000,000
- 1 ≤ queries의 길이 ≤ 1,000
- 0 ≤ i < j < arr의 길이
입출력 예
arr | queries | result |
[0, 1, 2, 3, 4] | [[0, 3],[1, 2],[1, 4]] | [3, 4, 1, 0, 2] |
- 입출력 예 #1: 각 쿼리에 따라 arr가 다음과 같이 변합니다. 따라서 [3, 4, 1, 0, 2]를 return 합니다.
arr |
[0, 1, 2, 3, 4] |
[3, 1, 2, 0, 4] |
[3, 2, 1, 0, 4] |
[3, 4, 1, 0, 2] |
class Solution {
public int[] solution(int[] arr, int[][] queries) {
int[] answer = {};
return answer;
}
}
풀이과정
:
정답
++ 다른사람의 풀이
문제5.
제한사항:
입출력 예
- 입출력 예 #1
- 입출력 예 #2
풀이과정
:
정답
++ 다른사람의 풀이
3. 이력서/지원/면접 준비 활동
'일지 > 취준일기' 카테고리의 다른 글
2024_12_11 취준일기 15일차 (0) | 2024.12.11 |
---|---|
2024_12_09 취준일기 14일차 (3) | 2024.12.09 |
2024_12_04 취준일기 12일차 (0) | 2024.12.05 |
2024_12_03 취준일기 11일차 (0) | 2024.12.03 |
2024_12_02 취준일기 10일차 (1) | 2024.12.02 |