입출력 예
bin1 | bin2 | result |
---|---|---|
"10" | "11" | "101" |
"1001" | "1111" | "11000" |
입출력 예 설명
나의 풀이
package 프로그래머스;
public class BinaryNumber {
public static String solution(String bin1, String bin2) {
String answer = "";
int num1 = Integer.parseInt(bin1, 2);
int num2 = Integer.parseInt(bin2, 2);
int binary = num1 + num2;
answer = Integer.toBinaryString(binary);
return answer;
}
public static void main(String[] args) {
solution("10","11");
}
}
나의 생각
처음에는 String answer
변수에 빈 문자열을 할당, 그리고 Integer.parseInt()
메서드를 사용하여 두 이진수 문자열을 각각 10진수로 변환후 , num1
,num2
변수에 저장, 이후 num1
,num2
를 더한 값을 binary
변수에 저장
마지막으로 Integer.toBinaryString()
메서드를 사용하여 binary 변수에 저장된 값을 다시 이진수 문자열로 변환하여 answer 변수에 할당하고, answer 변수를 리턴
해결 중인 풀이법
package 프로그래머스;
import java.util.Arrays;
public class BinaryNumber {
public static String solution(String bin1, String bin2) {
StringBuilder binary = new StringBuilder();
String[] b1Split = bin1.split("");
String[] b2Split = bin2.split("");
System.out.println(Arrays.toString(b1Split));
System.out.println(Arrays.toString(b2Split));
for(int i = 0; i < b1Split.length; i ++) {
if(b1Split[i].equals("0") && b2Split[i].equals("0") ) {
binary.append("0");
}else if(b1Split[i].equals("0") && b2Split[i].equals("1")||b1Split[i].equals("1") && b2Split[i].equals("0")) {
binary.append("1");
}else {
binary.append("10");
}
}
System.out.println("binary: "+ binary);
String answer ="";
return answer;
}
public static void main(String[] args) {
solution("1001","1111");
}
}
제한사항
입출력 예
s | result |
---|---|
"1 2 Z 3" | 4 |
"10 20 30 40" | 100 |
"10 Z 20 Z 1" | 1 |
"10 Z 20 Z" | 0 |
"-1 -2 -3 Z" | -3 |
입출력 예 설명
나의 풀이
package programmers;
public class CtrlZ {
public static int solution(String s) {
int answer = 0;
String[] str = s.split(" ");
for(int i = 0; i < str.length; i++) {
System.out.println(str[i]);
if("Z".equals(str[i])) {
answer -= Integer.parseInt(str[i-1]);
}else {
answer += Integer.parseInt(str[i]);
}
}
return answer;
}
public static void main(String[] args) {
solution("-1 -2 -3 Z");
}
}
나의 생각
매개변수 String s = "-1 -2 -3 Z"
가 들어 있을때, String 배열 str에 매개변수 s를 띄어쓰기 " "
로 짤라, 배열에 한칸씩 넣는다.
먼저, for문을 돌려 전체 반복을 시행하고, Z
문자가 나오기 전까지, Integer.parseInt
메서드를 사용하여 문자를 int형으로 변환하여 answer에 더해준다. 만약, str[i]
값에 Z
가 포함되면,answer -= Integer.parseInt(str[i-1]);
하여 Z
Index 직전의 값을 answer에서 빼주고 return.
Stack을 적용한 풀이 법
import java.util.Stack;
public class CtrlZ {
public static int solution(String s) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
String[] str = s.split(" ");
for (int i = 0; i < str.length; i++) {
if ("Z".equals(str[i])) {
if (!stack.isEmpty()) {
answer -= stack.pop();
}
} else {
int num = Integer.parseInt(str[i]);
stack.push(num);
answer += num;
}
}
return answer;
}
}
Java
에서 제공하는 스택(Stack)자료구조의 인스턴스를 선언하는 코드Last In, First Out (LIFO)
원칙을 따르는 자료구조로, 가장 나중에 들어온 요소가 가장 먼저 나가는 순서를 따름예시 👉🏻
Stack<Integer>
- push(E item) : 스택의 맨 위에 요소를 추가
- pop() : 스택의 맨 위에 있는 요소를 제거하고 반환, 스택이 비어있으면
EmptyStackException
이 발생- peek() : 스택의 맨 위 에 있는 요소를 제거하지 않고 반환
- isEmpty() : 스택이 비어있는지 확인, 비어있으면
true
, 그렇지않으면false
를 반환- size() : 스택에 있는 요소의 개수를 반환
스택은 다양한 알고리즘과 문제 해결에 사용되며, 괄홍 쌍 검사, 후위 표기법, DFS (깊이 우선 탐색)등의 알고리즘에서 자주 사용됨
입출력 예
n | result |
---|---|
12 | [2,3] |
17 | [17] |
420 | [2,3,5,7] |
입출력 예 설명
12를 소인수분해하면 2 2 3 입니다. 따라서 [2, 3]을 return합니다.
17은 소수입니다. 따라서 [17]을 return 해야 합니다.
420을 소인수분해하면 2 2 3 5 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.
나의 풀이
package programmers;
import java.util.LinkedHashSet;
import java.util.Set;
public class Factorization {
public static Set<Integer> solution(int n) {
Set<Integer> answer = new LinkedHashSet<>();
for(int i = 2; i <= n; i++) {
while(n%i == 0 ) {
n /= i;
answer.add(i);
}
}
return answer;
}
public static void main(String[] args) {
solution(990);
}
}
나의 생각
예를들어, n = 990 일때, 990의 소인수 분해 값은 233511 이 된다. 문제에선 소인수 값을 중복없이 추출하라 했으므로, 추출된 값을 List
나 다른 자료형 구조에 담지말고 Set
자료형을 써야겠다고 생각했다. 소인수분해시 , 반복문을 int i = 1부터 시행할 필요가 없기때문에, int i = 2 부터, 매개변수 n까지 반복을 돌린다고 하지만, 실제론 반복문의 n값이 점차 줄어들기때문에, 반복문의 반복 횟수도 점차 줄어든다.
따라서, n % i == 0
을 무한 반복 돌려, n % i 즉, 나머지가 0이 될때까지, n의 값을 Set
주머니에 담아 반복을 제거하여 answer값을 리턴한다.
내가 처음 생각했던 풀이 ( 반례 있음, 정답 아님 )
package programmers;
import java.util.LinkedHashSet;
import java.util.Set;
public class Factorization {
public static Set<Integer> solution(int n) {
Set<Integer> answer = new LinkedHashSet<>();
for(int i = 2; i <= n; i++) {
if(n%i == 0 ) {
n /= i;
answer.add(i);
i = 2;
}
}
System.out.println(answer);
return answer;
}
public static void main(String[] args) {
solution(990);
}
}
나의 생각
내가 처음에 했던 풀이법이다. While문 대신, if문을 썼는데, 반례 25개 중에 2개가 걸리는 바람에 문제를 다시 풀었다.
while문 풀이 | |
---|---|
![]() | ![]() |
i = 1로 초기화 시켰을 때 (정답)
import java.util.LinkedHashSet;
import java.util.Set;
class Solution {
public static Set<Integer> solution(int n) {
Set<Integer> answer = new LinkedHashSet<>();
for(int i = 2; i <= n; i++) {
if(n%i == 0 ) {
n /= i;
answer.add(i);
i = 1;
}
}
return answer;
}
}
한참 고민하다 그 이유를 알았다... 나는 반복의 시작이 i = 2니까, 마지막 초기화를 i = 2로 해줬는데, 다음반복에서 i = 2부터 시작하는것이 아니라 2 -> 3으로 점프해서 i = 3부터 시작하기 때문에 반례가 존재했던 것! 따라서, i = 1로 초기화 하면, 다음 반복에서 i = 2로 시작하기 때문에 확인한 소수를 다시 확인하게 되어 누락된 소인수를 찾을 수 있음
i = 2로 초기화 했을 때 | i = 1로 초기화 했을 때 |
---|---|
![]() | ![]() |
제한 사항
입출력 예
numbers | K | result |
---|---|---|
[1, 2, 3, 4] | 2 | 3 |
[1, 2, 3, 4, 5, 6] | 5 | 3 |
[1, 2, 3] | 3 | 2 |
입출력 예 설명
나의 풀이
package programmers;
public class TossBall {
public static int solution(int[] numbers, int k) {
int answer = 0;
for(int i = 0; i < k; i++) {
System.out.println(i+1 + "회 시행 : " + numbers[(2*i)%numbers.length] + " -> " + numbers[((2*i)+2)%numbers.length]);
answer = numbers[(2*i)%numbers.length];
}
System.out.println("최종 return 값: " + answer);
return answer;
}
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6};
solution(numbers, 5);
}
}
나의 생각
요즘 부쩍.. Level 0 단계 이지만, 고민을 하게 만드는 문제가 많은거 같다. 이번 문제 역시
쉽다면 쉽게 풀 수 있었던 문제같은데, 나의 경우 노트를 펴놓고 규칙성을 찾으면서 문제를 풀었다. for문에서의 반복후, for문을 재반복 하기 위해서는 모듈로 연산
을 연산을 하면 쉽게 풀 수 있다. 나는 %
계산으로 나머지
를 활용하여 반복을 돌렸는데, 이게 모듈로 연산
이라고 한다... 예를 보면 int[] numbers = {1,2,3,4,5,6}
이 있고, 5회 시행때 공을 던지는 사람이 누구인가? 에 대한 답을 찾는 문제였다. 핵심 키워드는 answer = numbers[(2*i)%numbers.length]
로 index는 짝수가 되어야 내가 원하는 값이 도출 되기때문에 위와 같은 규칙을 적용하여 문제를 해결할 수 있었다.
- i = 0일 때:
numbers[(2*0)%3] = numbers[0]이므로, 배열에서 첫 번째 요소인 1을 선택- i = 1일 때:
numbers[(2*1)%3] = numbers[2]이므로, 배열에서 세 번째 요소인 3을 선택- i = 2일 때:
numbers[(2*2)%3] = numbers[1]이므로, 배열에서 두 번째 요소인 2을 선택
class Solution {
public int solution(int[] numbers, int k) {
return (k-1)*2 % numbers.length+1;
}
}
입출력 예
array | result |
---|---|
[7,77,17] | 4 |
[10,29] | 0 |
입출력 예 설명
[7, 77, 17]
에는 7이 4개 있으므로 4를 return 합니다.[10, 29]
에는 7이 없으므로 0을 return 합니다.나의 풀이
package 프로그래머스;
public class NumberOfSeven {
public static int solution(int[] array) {
int count = 0;
String str = "";
for (int num : array) {
str += num;
}
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '7') {
count++;
}
}
return count;
}
public static void main(String[] args) {
solution(new int[]{7,77,17});
}
}
나의 생각
늘 내가 놓쳤던 부분 중에 하나인 정해진 매개변수의 타입을 말 그대로 정해진 대로
보는것이다. 즉, String타입의 변수가 있다고 했을때, 이 변수를 String타입으로만 보고, Int형 타입의 변수를 Int형으로만 문제를 접근하기때문에 더 활용도가 높은 메서드를 사용하지 못하였다. 이 문제 역시 Int형 배열{7,77,17}
이 있을때, 여기에 포함된 숫자 7의 갯수가 몇개인가? 를 찾는 문제이다. 단순하게 int형으로만 생각하면 7은 그렇다치고.. 77이나, 17,177,1771 등, 나눠서 나머지를 계산할 것인가? 나는 이 int형 배열을 먼저 문자형으로 변환하여 str변수에 넣어 77717 에서 문자7
의 갯수를 찾아 리턴하는 방법을 사용하였다.
제한사항
입출력 예
numbers | result |
---|---|
"onetwothreefourfivesixseveneightnine" | 123456789 |
"onefourzerosixseven" | 14067 |
입출력 예 설명
나의 생각
package 프로그래머스;
import java.util.LinkedHashMap;
import java.util.Map;
public class IHateEnglish {
public static long solution(String numbers) {
long answer = 0;
String str = "";
Map<Integer, String> strToInt = new LinkedHashMap<>();
strToInt.put(0,"zero");
strToInt.put(1,"one");
strToInt.put(2,"two");
strToInt.put(3,"three");
strToInt.put(4,"four");
strToInt.put(5,"five");
strToInt.put(6,"six");
strToInt.put(7,"seven");
strToInt.put(8,"eight");
strToInt.put(9,"nine");
for(Map.Entry<Integer, String> entry : strToInt.entrySet()) {
if(numbers.contains(entry.getValue())) {
str += entry.getKey();
}
}
System.out.println(str);
answer = Integer.parseInt(str);
System.out.println(answer);
return answer;
}
public static void main(String[] args) {
solution("ninesevenzerotwotwo");
}
}
숫자를 오름차순으로 정렬하며, 중복된 문자를 인식 못하는 문제가 발생
중간에 "zero" 문자가 있다면, 숫자로 변환시 제일 첫자리가 0이 되기때문에 0을 생략하고 숫자가 찍히는 문제가 발생
두번째 방법 ( 정답 )
package 프로그래머스;
import java.util.LinkedHashMap;
import java.util.Map;
public class IHateEnglish {
public static long solution(String numbers) {
long answer = 0;
StringBuilder str = new StringBuilder();
Map<String, Integer> strToInt = new LinkedHashMap<>();
strToInt.put("zero", 0);
strToInt.put("one", 1);
strToInt.put("two", 2);
strToInt.put("three", 3);
strToInt.put("four", 4);
strToInt.put("five", 5);
strToInt.put("six", 6);
strToInt.put("seven", 7);
strToInt.put("eight", 8);
strToInt.put("nine", 9);
while(!numbers.isEmpty()) {
for(Map.Entry<String, Integer> entry : strToInt.entrySet()) {
if(numbers.startsWith(entry.getKey())) {
str.append(entry.getValue());
numbers = numbers.substring(entry.getKey().length());
break;
}
}
}
answer = Long.parseLong(str.toString());
return answer;
}
public static void main(String[] args) {
solution("ninesevenzerotwotwo");
}
}
나의 생각
Map 자료구조에는 key
와 value
가 한쌍으로 들어가는데, 이를 이용하면 되겠다라는 생각을 먼저하게됐다. key
또는value
를 비교하여, key가 일치하면, value 값을 StringBuilder
형 변수 str에 추가하는 방법을 사용하였다. while문의 조건인 ! numbers.isEmpty()
를 통해, 무한 반복시키고, for문을 통해 반복을 돌려, numbers에서 특정문자로 시작하는 문자가 있으면 str.append 및 numbers는 substring
을 통해 문자를 빼주고, 문자가 아무것도 없으면 while문을 종료 한다.
획기적인 코드
class Solution {
public long solution(String numbers) {
String[] numbers_arr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for (int i = 0; i < numbers_arr.length; i++) {
numbers = numbers.replaceAll(numbers_arr[i], String.valueOf(i));
}
long answer = Long.parseLong(numbers);
return answer;
}
}
zero ~ nine
까지 String[] 배열에 담는다.- String[] 배열의 크기만큼 반복을 돌려
- 매개변수 String numbers을
zero ~ nine
까지 일치하면 숫자(문자로) replaceAll 해주는 방법으로 문제를 해결