문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

[입출력 예]

nonew_idresult

예1 "...!@BaT#*..y.abcdefghijklm" "bat.y.abcdefghi"
예2 "z-+.^." "z--"
예3 "=.=" "aaa"
예4 "123_.def" "123_.def"
예5 "abcdefghijklmn.p" "abcdefghijklmn"

코드

class Solution {
    public String solution(String new_id) {
    	new_id = new_id.toLowerCase(); //1단계
    	new_id = new_id.replaceAll("[^a-z0-9\\-_\\.]", "");//2단계
    	new_id = new_id.replaceAll("\\.{2,}", ".");//3단계
    	new_id = new_id.replaceAll("^\\.", "");//3단계
    	new_id = new_id.replaceAll("\\.$", "");//4단계
    	if(new_id.isEmpty()) new_id="a"; //5단계
    	if(new_id.length()>15) new_id = String.copyValueOf(new_id.toCharArray(), 0, 15);//6단계
    	new_id = new_id.replaceAll("\\.$", "");
    	for(;new_id.length()<3;) new_id= new_id.concat(new_id.charAt(new_id.length()-1)+"" );//7단계
        return new_id;
    }
}

결론

정규식 기초를 보는 문제 같다. 

내가 생각하는 이 문제에서 바라는 정규식 수준을 키워드로 나열하면,

(반복) 수량자,  콤마(.)의 활용, 문자 클래스 문법([ ] , 이 대괄호 속 문법은 약간 다름), 이스케이프(\), 앵커

이 정도 같다.

 

개인적으로는 이정도만 알고, 필요할 때 더 공부하는 것이 맞는 것 같다. 

 

 

 

자바에서 정규식은 이스케이프 문제를 이스케이프화하는 부분이 실수하기 좋은 부분 같다. 

정규식의 예약문자를 이스케이프 하기 위한 "\"는 자바에서도 예약 문자라 이스케이프 해줘야 한다.

"\" => "\\"

System.out.println("[^a-z0-9\\-_\\.]");
System.out.println("\\.{2,}");
System.out.println("^\\.");
System.out.println("\\.$");
System.out.println("\\.$");
---------------------------------------------
[^a-z0-9\-_\.]
\.{2,}
^\.
\.$
\.$

실질적으로 자바가 먼저 입력받은 문자열을 파싱한 후, 아래 출력 값을 정규식 인자로 사용할 것이다.

 

 

이 부분을 조금 편하게 하는 제 방식을 다음과 같다.

//오류 무시하고 작성
System.out.println("[^a-z0-9\-_\.]");
//빈공간에!!
System.out.println("");
// [^a-z0-9\-_\.] 를 복붙, 이클립스가 자동으로'\'=>'\\' 치환해줌
System.out.println("[^a-z0-9\\-_\\.]");

--------------------------------------------------
위 결과를 ctrl -H 로 일괄 치환하면, 위험할 수 있는 이유
//오류 무시하고 작성
System.out.println("[^a-z0-9\\-_\\.]");
//빈공간에!!
System.out.println("");
// [^a-z0-9\\-_\\.] 를 복붙
System.out.println("[^a-z0-9\\\\-_\\\\.]"); 다른 부분은 이렇게 될 수도 있다

 


 

'자료구조&알고리즘 > Level1' 카테고리의 다른 글

성격 유형 검사하기  (0) 2022.09.26
신고 결과 받기  (0) 2022.09.24
올바른 괄호  (1) 2022.09.23
크레인 인형뽑기 게임  (1) 2022.09.21
성격 유형 검사하기  (0) 2022.09.17

문제

import java.util.HashMap;
import java.util.Map;

class Solution {
	Map<Character, Integer> surveyMap = new HashMap<Character, Integer>();
	int[] scoreArr = {3,2,1,0,1,2,3};
	String[] survey;
	int[] choices;
	
	public String solution(String[] survey, int[] choices) {
    	this.survey = survey;
    	this.choices = choices;
    	
    	for(char key : "RTCFJMAN".toCharArray()) {
    		surveyMap.put(key, 0);
    	}
    	
    	for(int i=0; i<survey.length;i++) {
    		String tmp = survey[i];
    		char l = tmp.charAt(0);
    		char r = tmp.charAt(1);
			calculate(l,r,i);
    	}
    	
    	StringBuilder sb =new StringBuilder();
    	sb.append( sum('R','T')>=0?"R" : "T");
    	sb.append( sum('C','F')>=0?"C" : "F");
    	sb.append( sum('J','M')>=0?"J" : "M");
    	sb.append( sum('A','N')>=0?"A" : "N");

        return sb.toString();
    }
	private int sum(char l,char r) {
		return surveyMap.get(l) - surveyMap.get(r);
	}
	private void accumulateValue(char key, int value) {
		surveyMap.put(key, surveyMap.get(key)+value);
	}
	private void calculate(char l,char r, int i) {
		if(choices[i]<4) {
			accumulateValue(l, scoreArr[choices[i]-1]);
		}else {
			accumulateValue(r, scoreArr[choices[i]-1]);
		}
	}
}

 

 

'자료구조&알고리즘 > Level1' 카테고리의 다른 글

성격 유형 검사하기  (0) 2022.09.26
신고 결과 받기  (0) 2022.09.24
올바른 괄호  (1) 2022.09.23
크레인 인형뽑기 게임  (1) 2022.09.21
신규 아이디 추천  (0) 2022.09.18
public class Main {
	public static void main(String[] args) {
		System.out.println("         ,r'\"7");
		System.out.println("r`-_   ,'  ,/");
		System.out.println(" \\. \". L_r'");
		System.out.println("   `~\\/");
		System.out.println("      |");
		System.out.println("      |");
	}
}

 

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

곱셈  (0) 2022.06.15
나머지  (0) 2022.06.15
1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.BiFunction;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
	
		int value1 = scanner.nextInt();
		int value2 = scanner.nextInt();
		
		BiFunction<Integer, Integer, List<Integer>>  biFunc = 
				(val1,val2)->{
					List<Integer> list = new ArrayList<Integer>();
					int val001 = val2%10;
					int val010 = val2/10%10;
					int val100 = val2/100;
					
					list.add( val1*val001);
					list.add( val1*val010);
					list.add( val1*val100);
					list.add( val1*val2);
					
					return list;
				};
		List<Integer> resultList = calc(value1, value2, biFunc);

		for(Integer val : resultList) {
			System.out.println(val);
		}
		

	}

	public static List<Integer> calc(int a, int b, BiFunction<Integer, Integer, List<Integer>> biFunc){
		return biFunc.apply(a, b);
	}
}

핵심

자바의 정수형 연산 시 소수점 버림 활용 법

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

새싹  (0) 2022.06.15
나머지  (0) 2022.06.15
1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15

문제


(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?

(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

 

입력


첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)

 

출력


첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.

 

예시


입력 : 5  8  4

출력 

1

1

0

0

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.Function;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		List<Integer> intList = new ArrayList<Integer>();
		intList.add(scanner.nextInt());
		intList.add(scanner.nextInt());
		intList.add(scanner.nextInt());

		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return (A + B) % C;
		}));
		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return ((A%C) + (B%C))%C;
		}));
		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return (A*B)%C;
		}));
		System.out.println(calc(intList, (list) -> {
			int A = list.get(0);
			int B = list.get(1);
			int C = list.get(2);
			return  ((A%C) * (B%C))%C;
		}));

	}

	public static int calc(List<Integer> intList, Function<List<Integer>, Integer> func) {
		return func.apply(intList);
	}
}

핵심

알고리즘보다 자바8에 도입된 함수형 프로그래밍 개념을 사용

메서드를 값으로 다뤄 매개변수로 넣었음. 

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

새싹  (0) 2022.06.15
곱셈  (0) 2022.06.15
1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15

문제


ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.

불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

 

입력


서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

 

출력


불기 연도를 서기 연도로 변환한 결과를 출력한다.

 

예시


입력 : 2541

출력 : 1998

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println(scanner.nextInt()-543);
		
	}
	
}

핵심

예시를 보고 보정 값인 -543을 구하기

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

곱셈  (0) 2022.06.15
나머지  (0) 2022.06.15
??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15
A/B  (0) 2022.06.15

문제


준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

입력


첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.

출력


첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.

예시


입력값 : wow

출력값 : wow??!

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		String id1 = scanner.next();
		
		System.out.println(appendString(id1));
		
		
    }
	
	public static String appendString(String str) {
		return new StringBuffer(str).append("??!").toString();
	}
	
}

핵심

문자열 결합은 StringBuffer를 사용하는 것이 좋다. String은 변경불가능한 상수로 매번 새로운 객체가 생성되지만, StringBuffer는 문자 그대로 내부에 Buffer가 있어 불필요한 새로운 객체 생성이 없다.

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

나머지  (0) 2022.06.15
1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
사칙연산  (0) 2022.06.15
A/B  (0) 2022.06.15
AxB  (0) 2022.06.15
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
    
		int number1 = scanner.nextInt();
		int number2 = scanner.nextInt();
		
		System.out.println(add(number1, number2));
		System.out.println(subtraction(number1, number2));
		System.out.println(multi(number1, number2));
		System.out.println(division(number1, number2));
		System.out.println(mod(number1, number2));
    }
	
	public static int add(int number1, int number2) {
		return number1+ number2;
	}
	public static int subtraction(int number1, int number2) {
		return number1- number2;
	}
	public static int multi(int number1, int number2) {
		return number1* number2;
	}
	public static int division(int number1, int number2) {
		return number1/ number2;
	}
	public static int mod(int number1, int number2) {
		return number1% number2;
	}
	
}

핵심

나누기 / 와 나머지 % 구분

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

1998년생인 내가 태국에서는 2541년생?!  (0) 2022.06.15
??!  (0) 2022.06.15
A/B  (0) 2022.06.15
AxB  (0) 2022.06.15
A-B  (0) 2022.06.15
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
    
        System.out.println(scanner.nextDouble()/scanner.nextDouble());
    }
}

핵심

나누기는 /   

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

??!  (0) 2022.06.15
사칙연산  (0) 2022.06.15
AxB  (0) 2022.06.15
A-B  (0) 2022.06.15
A+B  (0) 2022.06.15
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
    
        System.out.println(scanner.nextInt()*scanner.nextInt());
    }
}

핵심

Java에서 곱하기는 * 

'자료구조&알고리즘 > 입출력과 사칙연산' 카테고리의 다른 글

사칙연산  (0) 2022.06.15
A/B  (0) 2022.06.15
A-B  (0) 2022.06.15
A+B  (0) 2022.06.15
  (0) 2022.06.15

+ Recent posts