https://school.programmers.co.kr/learn/courses/30/lessons/120813?language=java
Stream의 필터를 사용하는 방법
또는 i % 2 != 0인 조건식 사용
import java.util.stream;
class Solution {
public int[] solution(int n) {
return IntStream.rangeClosed(1,n).filter(i -> i % 2 == 1).toArray();
}
}
class Solution {
public int[] solution(int n) {
ArrayList<Integer> answer = new ArrayList<>();
for(int i = 1; i <= n; i++){
if(i % 2 != 0){
answer.add(i);
}
}
return answer.stream().mapToInt(i->i).toArray();
}
}
https://school.programmers.co.kr/learn/courses/30/lessons/81301
처음에 딱 생각난 방법은 그냥 단순하게 다중 분기문 쓰거나, replaceAll 메서드 사용하는것 밖에 생각이 안났다
class Solution {
public int solution(String s) {
StringBuffer sb = new StringBuffer();
char[] c = s.toCharArray();
for(int i = 0; i< c.length;){
if(Character.isDigit(c[i])){
// 숫자인 경우
sb.append(c[i]);
i++;
}else{
if(c[i] == 'z' || c[i] == 'n'){
if(c[i] == 'z'){
sb.append("0");
}else{
sb.append("9");
}
i += 4;
}else if(c[i] == 'o'){
i += 3;
sb.append("1");
}else if(c[i] == 't'){
i++;
if(c[i] == 'w'){
i += 2;
sb.append("2");
}else{
i+= 4;
sb.append("3");
}
}else if(c[i] == 'f'){
i++;
if(c[i] == 'o'){
i += 3;
sb.append("4");
}else{
i += 3;
sb.append("5");
}
}else if(c[i] == 's'){
i++;
if(c[i] == 'i'){
i += 2;
sb.append("6");
}else{
i += 4;
sb.append("7");
}
}else{
i += 5;
sb.append("8");
}
}
}
return Integer.parseInt(sb.toString());
}
}
그냥 생각도 안하고 다중 if로 쓰느라 가독성도 좋지 않았는데, 다른 사람 풀이를 보니 switch문에서 break를 잘 조절하여 가독성 있게 문제를 푸신분도 계셨다
-> 위 코드 실행 속도는 생각보다 너무 빨라서 놀랬다..
class Solution {
public int solution(String s) {
String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < strArr.length; i++) {
s = s.replaceAll(strArr[i], Integer.toString(i));
}
return Integer.parseInt(s);
}
}
처음엔 단순히 digit을 위한 배열 까지 만들었는데, 생각해보니 굳이 필요할거 같지 않아서 지웠다!
-> 앞에 코드랑 실행시간은 2배 더 걸렸다!
https://www.acmicpc.net/problem/9012
import java.io.*;
import java.util.Stack;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
Stack<Character> stack;
for(int i = 0; i < N; i++){
String str = br.readLine();
stack = new Stack<>();
boolean flag = true;
for(char c : str.toCharArray()){
if(c == '('){
stack.push('(');
}else if(!stack.isEmpty()){
stack.pop();
}else{
sb.append("NO" + "\n");
flag = false;
break;
}
}
if(flag){
if(stack.isEmpty()){
sb.append("YES" + "\n");
}else{
sb.append("NO" + "\n");
}
}
}
bw.write(sb.toString() + "\n");
bw.flush();
bw.close();
}
}
괄호의 종류가 한가지라 비교적 쉽게 풀었다
-> 괄호가 어짜피 한개라서 flag를 두는 대신 count를 세는 방식으로 해도 괜찮을것 같았다
https://www.acmicpc.net/problem/2830
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] binaryArr = new String[N];
int sum = 0;
for(int i = 0; i < N; i++){
String s = br.readLine();
binaryArr[i] = Integer.toBinaryString(Integer.parseInt(s));
}
for(int i = 0; i < N-1; i++){
for(int j = i; j < N; j++){
int maxLen = Math.max(binaryArr[i].length(), binaryArr[j].length());
binaryArr[i] = String.format("%" + maxLen + "s", binaryArr[i]).replace(' ', '0');
binaryArr[j] = String.format("%" + maxLen + "s", binaryArr[j]).replace(' ', '0');
StringBuilder sb = new StringBuilder();
for(int k = 0; k < maxLen; k++){
if(binaryArr[i].charAt(k) == binaryArr[j].charAt(k)){
sb.append('0');
}else{
sb.append('1');
}
}
String result = sb.toString();
sum += Integer.parseInt(result,2);
}
}
System.out.println(sum);
}
}
처음에 그냥 생각나는 대로 풀어보았따.. 값이 작은 데이터의 경우엔 괜찮았는데 인풋 데이터가 클때는 바로 메모리 초과 오류 발생..
for(int i = 0; i < binaryArr.length-1; i++){
for(int j = i+1; j < binaryArr.length; j++){
sum += binaryArr[i] ^ binaryArr[j]
}
}
생각해보니 두 자리가 같으면 0, 다르면 1이라는 것을 보니 XOR연산일것 깨닫고, 이를 통해 반복문을 통해 XOR 연산을 하며 sum에 더해 가는 방식으로 하였는데 이 경우에는 시간 초과가 났다
-> 문제의 인풋이 1 ≤ N ≤ 1,000,000 이였는데 이 경우 n^2은 너무 큰 복잡도였다
다른 분들 풀이를 보니 쉬프트 연산자를 사용해서 문제를 푸는 것 같다
-> 이 부분은 비트 연산 공부 후 다시 풀어봐야겠다..
https://www.acmicpc.net/problem/10807
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
HashMap<Integer, Integer> cntMap = new HashMap<>();
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
int val = Integer.parseInt(st.nextToken());
cntMap.put(val, cntMap.getOrDefault(val,0) + 1);
}
int target = Integer.parseInt(br.readLine());
System.out.println(cntMap.getOrDefault(target, 0));
}
}